我的Querybuilder语句如下所示:
$qb->from('models\Order', o');
$qb->innerJoin('o.fStatus', 'fs');
$qb->select('COUNT(o.id), PARTIAL fs.{name, id}');
如果我运行此操作,我会收到错误
SELECT COUNT(o.id),': Error: Cannot select entity through identification variables without choosing at least one root entity alias.
但是,如果我将select语句更改为以下任何一个:
$qb->select('PARTIAL o.{id}, PARTIAL fs.{name, id}');
$qb->select('COUNT(o.id), fs.name, fs.id');
查询将会运行。
为什么我不能从根实体中选择,也不能选择已加入它的部分对象?
答案 0 :(得分:1)
Doctrine给出了一些解释in their documentation:
初学者的一个常见错误是将DQL误认为只是某种形式的SQL,因此尝试在查询中使用表名和列名或将任意表连接在一起。您需要将DQL视为对象模型的查询语言,而不是关系模式。
当您选择使用DQL或QueryBuilder时,传统上希望您选择根实体(FROM
子句中的实体),或列/聚合的某些组合(COUNT
,{ {1}}等)。当你从连接表中选择一个部分对象但是没有选择根实体时,Doctrine不知道如何保湿 - 如果有一对多/多对一怎么办,它如何返回数据?它不会做出这些假设。
默认情况下的学说does not allow partial objects。看起来你最好只为你的查询返回列,因为在那种情况下你真正想要的就是这样。
其他人使用SUM
子句解决了这个问题 - 请参阅Doctrine query distinct related entity。