Doctrine2:不能在不选择至少一个根实体别名的情况下通过标识变量选择实体

Per*_*ion 6 php mysql doctrine symfony doctrine-orm

我被困在一个最初非常简单的学说 2 查询中。我有一个名为 Category 的实体,它与自身有一个 OneToMany 关系(对于父类和子类)。

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
 */
private $parent;

/**
 * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
 */
private $children;
Run Code Online (Sandbox Code Playgroud)

以下查询

$q = $this->createQueryBuilder('c')
            ->leftJoin('c.children', 'cc')
            ->select('c.name as title, cc')
            ->where('c.parent IS NULL');
Run Code Online (Sandbox Code Playgroud)

因错误而失败

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

我真的不明白这个问题。如果我省略了该->select部分,则查询确实有效并给出了预期的结果。我已经在论坛上搜索过,但找不到有效的解决方案。有人有建议吗?非常感谢。

Jas*_*man 4

您的问题是,您尝试从类别实体中选择一个字段,同时选择已连接类别实体的整个对象。与普通 SQL 不同,使用 QueryBuilder 组件,您不能仅从要加入的表中选择实体。

如果您希望返回带有连接子项的主类别对象,您可以执行->select(array('c', 'cc')),或者干脆完全省略该->select()调用。前者将在单个查询中自动选择您需要的子项。如果您想访问主类别实体上的子实体,则后者将需要另一个 SQL 查询。

如果您出于某种原因想要在对象中name进行选择title,则始终可以向实体添加另一个函数,该函数是用于检索名称的别名,而不必将其写入查询中:

function getTitle()
{
    return $this->getName();
}
Run Code Online (Sandbox Code Playgroud)