我有两个实体,第一个叫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
关系起作用。
答案 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
部分。