我被一个原本非常简单的 doctrine 2 查询所困。我有一个名为 Category 的实体,它与自身具有 OneToMany 关系(对于父类别和子类别)。
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
*/
private $children;
下面的查询
$q = $this->createQueryBuilder('c')
->leftJoin('c.children', 'cc')
->select('c.name as title, cc')
->where('c.parent IS NULL');
因错误而失败
Cannot select entity through identification variables without choosing at least one root entity alias.
我真的不明白这个问题。如果我省略了 ->select
部分,查询确实有效并给出了预期的结果。我已经搜索了论坛,但找不到有效的解决方案。有人有建议吗?非常感谢。
最佳答案
您的问题是您试图从类别实体中选择一个字段,同时选择已连接类别实体的整个对象。与普通 SQL 不同,使用 QueryBuilder 组件,您不能仅从要加入的表中选择实体。
如果您希望返回包含已连接子项的主类别对象,您可以执行 ->select(array('c', 'cc'))
,或者简单地省略 ->select()
一起调用。前者将在单个查询中自动选择您需要的 child 。如果您想访问主要类别实体上的子项,后者将需要另一个 SQL 查询。
如果您出于某种原因希望 name
在您的对象中选择为 title
,您始终可以向您的实体添加另一个函数,该函数是检索名称的别名而不是必须在您的查询中编写它:
function getTitle()
{
return $this->getName();
}
关于php - Doctrine 2 : Cannot select entity through identification variables without choosing at least one root entity alias,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34513052/