2

我有以下 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 的实体具有多对一关系。随着数据库的正确设置和固定装置的填充,关系似乎设置正确,但是当我尝试运行上述查询时,我遇到了以下错误:

在 acmeStyleGuideBundle:Page:pages.html.twig 中渲染模板(“[Semantical Error] line 0, col 130 near 'codeExample =': Error: Invalid PathExpression.StateFieldPathExpression or SingleValuedAssociationField 预期。”)时引发异常在第 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,我只是无法自己解决这个问题。

这是我的代码示例实体:

/**
 * @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

1 回答 1

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

于 2013-10-03T14:38:18.350 回答