Symfony加载实体与where和order by

时间:2016-01-05 10:14:45

标签: symfony join doctrine-orm repository dql

我有两个实体,第一个叫Page,第二个PageEntry

PageEntries在Page中映射为:

/**
 * @var \Doctrine\Common\Collections\Collection|PageEntry[]
 *
 * @ORM\ManyToMany(targetEntity="PageEntry")
 * @ORM\JoinTable(name="foobar_page_to_entries")
 * @ORM\OrderBy({"position" = "ASC"})
 */
private $entries;

我现在尝试在PageRepository中添加一个函数来加载条件PageEntry并按hide = false排序的所有已加入的position ASC

为此,我创建了这个函数:

public function getEntriesByPage(Page $page = null) {
    if (empty($page)) {
        return array();
    }

    $query = $this->_em->createQueryBuilder()
            ->select('e')
            ->from('FooBarBundle:Page', 'p')
            ->andWhere('p.id = :id')
            ->join('p.entries', 'e')
            ->andWhere('e.hide = :hide')
            ->addOrderBy('e.position', 'ASC')

            ->setParameters(array(
                'hide'  => false,
                'id'    => $page->getId()
            ))
    ;

    return $query->getQuery()->getResult();
}

这导致Semantical Error

  

[语义错误]第0行,在'SELECT e FROM'附近的col -1:错误:如果不选择至少一个根实体别名,则无法通过标识变量选择实体。

我该怎么做才能解决这个问题?或者,还有更好的方法? (我尝试使用Criteria,但是Doctrine的版本有点过时,告诉我,Criteria只对OneToMany关系起作用。

2 个答案:

答案 0 :(得分:0)

像这样更改您的查询并尝试一下。如果有任何问题,请告诉我。

$query = $this->_em->createQueryBuilder()
            ->select('e')
            ->from('FooBarBundle:Page', 'p')
            ->join('p.entries', 'e')
             ->Where('p.id = :id')
            ->andWhere('e.hide = :hide')
            ->OrderBy('e.position', 'ASC')

            ->setParameters(array(
                'hide'  => false,
                'id'    => $page->getId()
            ))
    ;

答案 1 :(得分:0)

您必须将根别名'p'添加到select语句中才能使此查询生效:

$query = $this->_em->createQueryBuilder()
    ->select('p', 'e')
    ->from('FooBarBundle:Page', 'p')
    ->andWhere('p.id = :id')
    ->join('p.entries', 'e')
    ->andWhere('e.hide = :hide')
    ->addOrderBy('e.position', 'ASC')

    ->setParameters(array(
        'hide'  => false,
        'id'    => $page->getId()
    ));

由于你在PageRepository,你可以做得更简单:

$query = $this->createQueryBuilder('p')
    ->addSelect('e')
    ->andWhere('p.id = :id')
    ->join('p.entries', 'e')
    ->andWhere('e.hide = :hide')
    ->addOrderBy('e.position', 'ASC')
如果您已经在正确的实体存储库中,则不需要

from。您只需将实体的别名(在本例中为'p')直接传递给createQueryBuilder方法,然后跳过from部分。