我有以下DQL查询:
public function findByIdJoinedToCodeExample($pageId)
{
$query = $this->getEntityManager()
->createQuery('
SELECT c FROM acmeStyleGuideBundle:codeExample c
JOIN c.PageContent p
WHERE p.codeExample = :cex'
)
->setParameter('cex', $pageId);
try {
return $query->getResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
它试图从名为codeExample的实体中检索数据,该实体与名为PageContent的实体具有ManyToOne关系。在正确设置数据库并正在填充灯具时,似乎正确设置了关系,但是当我尝试运行上述查询时,我遇到以下错误:
在acmeStyleGuideBundle:Page:pages中呈现模板期间抛出异常(“[语义错误]第0行,第130行'codeExample =':错误:无效的PathExpression。StateFieldPathExpression或SingleValuedAssociationField。”)。第16行的html.twig。
由以下控制器调用:
// find the current pages code examples (if there are any)
public function findCodeExamplesAction($pageId =10)
{
$em = $this->getDoctrine()->getManager();
$codeExample = $this->getDoctrine()
->getRepository('acmeStyleGuideBundle:codeExample')
->findByIdJoinedToCodeExample($pageId);
return $this->render(
'acmeStyleGuideBundle:Page:codeExample.html.twig',
array(
'Code' => $codeExample
)
);
}
注意:$ pageID = 10是因为它告诉我没有填充pageID。这似乎是一个单独的问题,所以我现在设置了默认值。
我已经看了好几个小时,但我还在学习Doctrine和Symfony,而我自己也无法想象这一点。
以下是我的codeExample实体:
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="textExample", type="text")
*/
private $textExample;
/**
* @var string
*
* @ORM\Column(name="codeExample", type="text")
*/
private $codeExample;
/**
* @var integer
*
* @ORM\Column(name="lang", type="integer")
*/
private $lang;
/**
* @ORM\ManyToMany(targetEntity="PageContent", mappedBy="codeExample")
*/
protected $PageContent;
/**
* Constructor
*/
public function __construct()
{
$this->PageContent = new \Doctrine\Common\Collections\ArrayCollection();
}
以下是PageContent的实体:
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var ArrayCollection $pageSector_Id;
* @ORM\ManyToMany(targetEntity="pageSector", inversedBy="PageContent")
* @ORM\JoinTable(
* name="pageSector_PageContent",
* joinColumns={@ORM\JoinColumn(name="PageContent_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="pageSector_Id", referencedColumnName="id")}
* )
*/
protected $pageSector;
/**
* @var ArrayCollection $pageCategory_Id;
* @ORM\ManyToMany(targetEntity="pageCategory", inversedBy="PageContent")
* @ORM\JoinTable(
* name="pageCategory_PageContent",
* joinColumns={@ORM\JoinColumn(name="PageContent_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="pageCategory_Id", referencedColumnName="id")}
* )
*/
protected $pageCategory;
/**
* @ORM\ManyToOne(targetEntity="pageTypes", inversedBy="PageContent")
* @ORM\JoinColumn(name="pageTypesId", referencedColumnName="id")
*/
protected $pageTypes;
/**
* @var integer
*
* @ORM\Column(name="pageTypesId", type="integer")
*/
private $pageTypesId;
/**
* @ORM\OneToMany(targetEntity="PageContent", mappedBy="parentPage")
*/
private $childPages;
/** @ORM\ManyToOne(targetEntity="PageContent", inversedBy="childPages")
* @ORM\JoinColumn(name="parentPage_id", referencedColumnName="id")
**/
private $parentPage;
/**
* @var string
*
* @ORM\Column(name="pageName", type="string", length=255)
*/
private $pageName;
/**
* @var string
*
* @ORM\Column(name="pageUrl", type="string", length=255)
*/
private $pageUrl;
/**
* @var string
*
* @ORM\Column(name="richText", type="text")
*/
private $richText;
/**
* @var ArrayCollection $pageSector_Id;
* @ORM\ManyToMany(targetEntity="codeExample", inversedBy="PageContent")
* @ORM\JoinTable(
* name="codeExample_PageContent",
* joinColumns={@ORM\JoinColumn(name="PageContent_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="codeExample_Id", referencedColumnName="id")}
* )
*/
protected $codeExample;
你能给我的任何建议都会很棒。我完全被困在这里了。
答案 0 :(得分:4)
我设法自己解决了这个问题:
$query = $this->getEntityManager()
->createQuery('
SELECT c FROM acmeStyleGuideBundle:codeExample c
JOIN c.PageContent p
WHERE p.codeExample = :cex'
)
->setParameter('cex', $pageId);
应该是:
$query = $this->getEntityManager()
->createQuery('
SELECT c FROM acmeStyleGuideBundle:codeExample c
JOIN c.PageContent p
WHERE p.id = :cex'
)
->setParameter('cex', $pageId);
这对我来说似乎很奇怪,因为我认为对象的目的是不使用id,但它的工作原理对我来说已经足够了。如果有更好的方法,请随时告诉我。