2013-10-03 45 views
2

我有以下DQL查询:DQL查询返回:StateFieldPathExpression或SingleValuedAssociationField预期

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; 
    } 
} 

它正试图从与所谓PageContent实体的多对一的关系称为codeExample实体retreive数据。的关系似乎是正确设置为数据库被正确设置,并且正在填充灯具但是当我尝试运行我面临着以下错误上面的查询:

An exception has been thrown during the rendering of a template ("[Semantical Error] line 0, col 130 near 'codeExample =': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.") in acmeStyleGuideBundle:Page:pages.html.twig at line 16.

它被所谓由以下控制器:

// 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; 

什么建议可以给我将是惊人的。我完全陷在这里。

回答

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,但它的工作对我来说已经足够了。如果有更好的方法,请随时告诉我。

+1

你应该可以做WHERE c =:cex –

+0

请记住,当我们使用Entities使用Doctrines in Repositories时,我们必须使用Entity not Database Table列名中的列名。我认为你在数据库表和实体中具有相同的Id,如果你愿意,可以与其他列一起检查。 – Developer