DQL查询返回:StateFieldPathExpression或SingleValuedAssociationField

时间:2013-10-03 13:59:04

标签: php symfony doctrine-orm doctrine dql

我有以下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;

你能给我的任何建议都会很棒。我完全被困在这里了。

1 个答案:

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