如何在Doctrine中获得一个订单的用户数量/数量?

时间:2017-06-29 08:22:05

标签: php symfony doctrine-orm doctrine

我正在开发基于Symfony 2.8的项目,该项目允许user放置order

现在我想创建一个Doctrine查询,该查询返回users的数量,其中只有一个order。我觉得这很容易,但我已经好几个小时......

  1. 选择用户及其订单数量
  2. 从步骤1
  3. 的结果中选择order_count = 1的所有用户
  4. 通过在步骤2的结果中仅选择用户的订单并添加条件(例如,状态=已完成)来应用更多过滤器
  5. 在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不起作用),如何在外部选择中引用计数结果?

2 个答案:

答案 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查询可能具有更好的性能,更易于理解和维护。