Doctrine DQL - 在一个查询中按品牌和日期排序的订单总和

时间:2015-02-25 15:43:32

标签: symfony doctrine-orm dql

我正在使用Symfony 2。

我需要创建一个DQL查询,它将为我提供以这种形式显示的数据:

enter image description here

我需要品牌和年份的所有订单总和。

数据库中的必需表如下所示:

品牌:

enter image description here

VOrder:

enter image description here

到目前为止,我已经设法为每个DQL提取了一年,订单价值和品牌,但这远远不是我想要的地方:

    $query = $em->createQuery(
        "SELECT SUBSTRING(o.date, 1, 4), o.value, b.name
         FROM AppBundle:VOrder o
         LEFT JOIN AppBundle:Brand b WITH b.id = b
         GROUP BY o.date"
    );

我的问题归结为以下几点: 1.只用一个查询就可以达到预期的结果(参见上表)吗? 2.我从哪里可以获得所需数据?

3 个答案:

答案 0 :(得分:1)

这可以通过一个查询来完成,但我认为没有DQL这样做是最好的。

The documentation explains the drawbacks of using DQL for aggregate fields

在文档中查看how to run native SQL with doctrine

查询本身应该执行GROUP BY YEAR(date)SUM(value)

SELECT 
  YEAR(o.date), 
  SUM(o.value), 
  b.name 
FROM brands b 
LEFT JOIN orders o 
  ON o.brand_id = b.id 
GROUP BY YEAR(o.date);

答案 1 :(得分:0)

您需要下一个查询:

$query = $em->createQuery(
    "SELECT YEAR(o.date), sum(o.value), b.name
     FROM AppBundle:VOrder o
     LEFT JOIN AppBundle:Brand b WITH b.id = o.brand_id
     GROUP BY YEAR(o.date), b.name"
);

答案 2 :(得分:0)

在我的同事的帮助下,我设法找到了与我一直在寻找的DQL:

    $query = $em->createQuery(
        "SELECT SUBSTRING(o.date, 1, 4) AS year, SUM(o.value), b.name
         FROM AppBundle:Brand b
         LEFT JOIN AppBundle:VOrder o WITH o.brand = b.id
         GROUP BY year, b.id" 
    );

DQL上没有YEAR()函数,因此解决方法是使用SUBSTRING()。