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

时间:2015-12-29 14:26:19

标签: php mysql symfony doctrine-orm doctrine

我坚持原本非常简单的学说2查询。我有一个名为Category的实体,它与自身具有OneToMany关系(对于父类和子类)。

<title>Bla bla ABC</title>.

以下查询

/**
 * @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'); 部分,查询确实有效并给出预期结果。我已经搜索了论坛,但无法找到解决方案,这很有效。有没有人有建议?非常感谢。

2 个答案:

答案 0 :(得分:2)

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

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

如果您希望name在对象中选择title,则可以随时向实体添加另一个函数,该函数是检索名称的别名,而不必写入在您的查询中:

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

答案 1 :(得分:0)

您的查询缺少部分内容。 repo中的普通查询构建器就像

mysql fallback charset