如何使用Symfony的查询构建器创建日期范围计数器并用零填充空白

问题描述 投票:0回答:1

我有一个查询,通过按注册日期对用户进行分组来对用户进行计数。

return $this->createQueryBuilder('s')
->select(' date(s.created_at) as x, count(1) as y')
->where("s.created_at between datesub(now(), :months, 'Month') and now()")
->setParameter('months', $months)
->groupBy('x')
->orderBy('x')
->getQuery()
->getResult();

但是它们目前是我的数据集中的空白。

所以我有sql请求来填补空白,但我不知道如何使用Symfony的查询构建器创建复杂的请求。

SELECT ranger.ranger_date AS x, COALESCE(counter.counter_value, 0) as y
FROM (
    SELECT DATE(s.created_at) AS counter_date, count(*) AS counter_value
    FROM statistic AS s
    WHERE s.created_at between DATE_SUB(NOW(), INTERVAL 3 MONTH) and now()
    GROUP BY counter_date
) AS counter
RIGHT JOIN (
    SELECT DATE(DATE_SUB(NOW(), INTERVAL units.i + tens.i * 10 + hundreds.i * 100 DAY)) AS ranger_date
    FROM (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)units
    CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)tens
    CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)hundreds
    WHERE DATE_SUB(NOW(), INTERVAL units.i + tens.i * 10 + hundreds.i * 100 DAY) BETWEEN DATE_SUB(NOW(), INTERVAL 3 MONTH) AND NOW()
) AS ranger
ON ranger.ranger_date = counter.counter_date
ORDER BY ranger.ranger_date

我已经尝试过createQuery方法,但是没有用...

doctrine symfony4 query-builder
1个回答
0
投票
如果复杂的本地sql查询成功返回所需的结果集:

您可以简单地prepare and execute the query as documented by Symfony。如果需要水合实体,则可以使用the NativeQuery class

© www.soinside.com 2019 - 2024. All rights reserved.