我正在开发基于Symfony 2.8
的项目,该项目允许user
放置order
。
现在我想创建一个Doctrine
查询,该查询返回users
的数量,其中只有一个order
。我觉得这很容易,但我已经好几个小时......
order_count = 1
的所有用户
在SQL中,以下工作正常以解决步骤1:
SELECT user_id, COUNT(*) as count FROM order WHERE status = 'completed' GROUP BY user_id
但是当我尝试将其翻译为Doctrine
时,我收到以下错误:
$qb->select('o_inner.user, COUNT(*) as count')
->from('MyBundle:Order', 'o_inner')
->where('o_inner.status = :status')
->groupBy('o_inner.user')
->setParameter('status', 'completed');
[Doctrine\ORM\Query\QueryException]
[Syntax Error] line 0, col 30: Error: Expected Literal, got '*'
所以我甚至无法解决第一步。知道怎么做吗?
修改
用不同的选择做了一些更多的实验:
$qb->select('o_inner.user, COUNT(o_inner.user) as count')
$qb->select('COUNT(o_inner.user) as count')
==> [Doctrine\ORM\Query\QueryException]
[Semantical Error] line 0, col 39 near 'FROM MyBundle:Order': Error: Class 'FROM' is not defined.
$qb->select('COUNT(o_inner.user)')
==> Works fine. So the "as count" statement seems to be a problem
$qb->select('o_inner.user')
==> [Doctrine\ORM\Query\QueryException]
[Semantical Error] line 0, col 12 near 'user FROM': Error: Invalid PathExpression. Must be a StateFieldPathExpression.
$qb->select('o_inner')
==> Workes fine
$qb->select('o_inner, COUNT(o_inner.user)')
==> Workes fine
所以$qb->select('o_inner, COUNT(o_inner.user)')
似乎适用于第1步。但由于我无法使用自定义别名(... as count
不起作用),如何在外部选择中引用计数结果?
答案 0 :(得分:1)
您正在使用ORM,因此您需要指定要计算的字段,例如:
$qb->select('o_inner.user, COUNT(o_inner.user) as count')
->from('MyBundle:Order', 'o_inner')
->where('o_inner.status = :status')
->groupBy('o_inner.user')
->setParameter('status', 'completed');
;
$tags = $qb->getQuery()->getResult();
答案 1 :(得分:0)
您不必将ORM用于报告/统计等复杂查询。
单一优化的SQL查询可能具有更好的性能,更易于理解和维护。