使用部分和非部分选择来自学说中的连接

时间:2016-01-05 19:31:25

标签: symfony select doctrine-orm query-builder dql

我的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');

查询将会运行。

为什么我不能从根实体中选择,也不能选择已加入它的部分对象?

1 个答案:

答案 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

相关问题