php – Doctrine2:如果不选择至少一个根实体别名,则无法通过标识变量选择实体

我坚持原本非常简单的学说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.

我真的不明白这个问题.如果省略 – >选择部分,查询确实有效并给出预期结果.我已经搜索了论坛但找不到解决方案,这很有效.有没有人有建议?非常感谢.

最佳答案 您的问题是您尝试从类别实体中选择一个字段,同时选择已连接的类别实体的整个对象.与纯SQL不同,使用QueryBuilder组件时,您无法仅从要加入的表中选择实体.

如果您希望使用已连接的子项返回主类别对象,则可以执行 – > select(array(‘c’,’cc’)),或者只是省略 – > select()调用.前者将在单个查询中自动选择您需要的子项.如果要访问主类别实体上的子项,后者将需要另一个SQL查询.

如果您希望在对象中选择名称作为标题,则可以始终向实体添加另一个函数,该函数是用于检索名称的别名,而不必在查询中将其写入:

function getTitle()
{
    return $this->getName();
}
点赞