我正在使用Symfony 2。
我需要创建一个DQL查询,它将为我提供以这种形式显示的数据:
我需要品牌和年份的所有订单总和。
数据库中的必需表如下所示:
品牌:
VOrder:
到目前为止,我已经设法为每个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.我从哪里可以获得所需数据?
答案 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()。