Laravel 中按日期范围查询并补全缺失日期的计数(含零值)

秋静吖_4093

秋静吖_4093

2026-09-10

223人浏览

原创

Laravel 中按日期范围查询并补全缺失日期的计数(含零值)

在 laravel 中实现按指定日期范围统计每日数据量,即使某日无记录也返回 0,需结合 carbonperiod 生成完整日期序列,并对每日期单独查询或使用 left join + 日历表方式优化。

在 laravel 中实现按指定日期范围统计每日数据量,即使某日无记录也返回 0,需结合 carbonperiod 生成完整日期序列,并对每日期单独查询或使用 left join + 日历表方式优化。

在实际业务中(如后台数据看板、用户活跃度分析),我们常需获取连续日期区间内的聚合统计(如每日新增用户数),但数据库中仅存有发生行为的日期记录。若直接 GROUP BY date 查询,缺失日期将完全不出现,无法满足前端图表渲染所需的完整时间轴。Laravel 本身不提供内置“日期补全”功能,需通过逻辑层补全或数据库层构造日历序列来解决。

✅ 推荐方案:CarbonPeriod + 批量查询(简洁可靠,适合中小数据量)

首先确保已安装 nesbot/carbon(Laravel 默认已包含):

composer require nesbot/carbon

然后使用 CarbonPeriod 生成目标日期范围,并逐日查询计数:

use Carbon\CarbonPeriod;
use Illuminate\Support\Facades\DB;

$startDate = '2022-07-25';
$endDate   = '2022-08-02';

$period = CarbonPeriod::create($startDate, $endDate);
$result = [];

foreach ($period as $date) {
    $count = DB::table('your_table_name')
        ->whereDate('date', $date->format('Y-m-d'))
        ->count('user_id');

    $result[] = [
        'date'       => $date->format('Y-m-d'),
        'user_count' => (int) $count,
    ];
}

// 返回 JSON 或用于视图
return response()->json($result);

✅ 输出示例:

[
  {"date":"2022-07-25","user_count":0},
  {"date":"2022-07-26","user_count":0},
  ...
  {"date":"2022-08-02","user_count":2}
]

⚠️ 注意事项与优化建议

  • N+1 查询风险:上述方法会执行 n 次数据库查询(n = 天数)。若日期跨度大(如 365 天),性能可能下降。此时推荐以下进阶方案:

    Laravel Cloud
    Laravel Cloud

    Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。

    下载
  • 数据库日历表(最优性能):
    创建一个只含单列 date 的日历辅助表(预填充 10 年日期),再通过 LEFT JOIN 关联主表:

    $startDate = '2022-07-25';
    $endDate   = '2022-08-02';
    
    $result = DB::table(DB::raw("(SELECT DATE_ADD(?, INTERVAL seq DAY) AS date 
                                  FROM (SELECT 0 AS seq UNION SELECT 1 UNION SELECT 2 UNION ... ) s 
                                  WHERE DATE_ADD(?, INTERVAL seq DAY) select('calendar.date', DB::raw('COALESCE(COUNT(t.user_id), 0) as user_count'))
        ->leftJoin('your_table_name as t', DB::raw('DATE(t.date)'), '=', 'calendar.date')
        ->groupBy('calendar.date')
        ->orderBy('calendar.date', 'DESC')
        ->setBindings([$startDate, $startDate, $endDate])
        ->get();

    ? 实际项目中建议用真实日历表替代 UNION 临时构造,更稳定高效。

  • Eloquent 替代写法(如模型为 Activity):

    $dates = collect(CarbonPeriod::create($startDate, $endDate))
        ->mapWithKeys(fn($d) => [$d->format('Y-m-d') => 0]);
    
    $counts = Activity::whereBetween('date', [$startDate, $endDate])
        ->selectRaw('DATE(date) as date, COUNT(*) as count')
        ->groupBy('date')
        ->pluck('count', 'date'); // key: date, value: count
    
    $result = $dates->merge($counts)->map(fn($count, $date) => [
        'date'       => $date,
        'user_count' => (int) $count,
    ])->values();

✅ 总结

  • 小范围(≤30 天):首选 CarbonPeriod + 循环查询,代码清晰、易维护;
  • 大范围或高频调用:务必使用日历表 + LEFT JOIN,避免 N+1,保障响应性能;
  • 始终使用 whereDate() 而非 where('date', ...),确保兼容 DATETIME 类型字段;
  • 返回结构统一为数组字典,便于前端按 date 渲染折线图/柱状图。

通过合理组合 Laravel 的查询构建器与 Carbon 工具,可优雅解决“稀疏时间序列补零”这一典型数据分析需求。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11884

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6821

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2195

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4328

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

5054

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3971

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5717

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4482

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12362

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 218人学习

Composer手册
Composer手册

共0课时 | 0人学习