2013-10-03 43 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