我坚持原本非常简单的学说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');
部分,查询确实有效并给出预期结果。我已经搜索了论坛,但无法找到解决方案,这很有效。有没有人有建议?非常感谢。
答案 0 :(得分:2)
您的问题是您尝试从类别实体中选择一个字段,同时选择已连接的类别实体的整个对象。与纯SQL不同,使用QueryBuilder组件,您只能从您正在加入的表中选择一个实体。
如果您希望使用已加入的子项返回主类别对象,则可以执行->select(array('c', 'cc'))
,或者只是省略->select()
调用。前者将在单个查询中自动选择您需要的子项。如果要访问主类别实体上的子项,后者将需要另一个SQL查询。
如果您希望name
在对象中选择title
,则可以随时向实体添加另一个函数,该函数是检索名称的别名,而不必写入在您的查询中:
function getTitle()
{
return $this->getName();
}
答案 1 :(得分:0)
您的查询缺少部分内容。 repo中的普通查询构建器就像
mysql fallback charset