Laravel 13 中实现每日数据查询并补零的核心是:先用 CarbonPeriod 生成完整日期数组,再通过 DB 查询获取实际数据并转为键值对,最后遍历日期数组合并数据,缺失日期填充 0。

在 Laravel 13 中实现“查询每日数据并自动填充缺失日期为 0”,核心思路是:先生成目标时间范围内完整的日期序列,再与实际数据库查询结果左关联(或合并),把没数据的日期补上 0。Laravel 本身不直接支持“日期补零”,需手动构造日期范围并做数据对齐。
生成连续日期数组
用 PHP 的 CarbonPeriod 快速生成指定区间内每天的日期字符串(如 '2024-05-01'):
- 安装 Carbon(Laravel 13 已内置,无需额外引入)
- 代码示例:
use Carbon\Carbon;
use Carbon\CarbonPeriod;
$startDate = '2024-05-01';
$endDate = '2024-05-07';
$dates = CarbonPeriod::create($startDate, $endDate)
->map(fn($date) => $date->format('Y-m-d'))
->toArray();
// ['2024-05-01', '2024-05-02', ..., '2024-05-07']
?>
查出真实数据并转成键值对
从数据库中查出有记录的日期及其对应数值(比如订单数、访问量),用日期作 key,方便后续合并:
- 假设统计
orders表每日创建数量: - 使用 Laravel 查询构造器:
$data = DB::table('orders')
->selectRaw("DATE(created_at) as date, COUNT(*) as count")
->whereBetween('created_at', [$startDate, $endDate])
->groupBy('date')
->pluck('count', 'date')
->mapWithKeys(fn($count, $date) => [$date => (int)$count]);
// Collection like ['2024-05-01' => 12, '2024-05-03' => 5]
?>
合并日期与数据,缺失补 0
遍历完整日期数组,逐个检查是否存在于查询结果中,不存在就设为 0:
- 简洁写法(PHP 8+):
$result = array_map(function($date) use ($data) {
return [
'date' => $date,
'count' => $data->get($date, 0),
];
}, $dates);
// 结果是标准数组,每项含 date 和 count
?> - 若需返回 JSON 给前端,可直接
return response()->json($result);
进阶:封装成复用方法(推荐)
把上述逻辑抽成一个静态辅助方法,放在 app/Helpers/DateHelper.php 或模型里:
- 示例签名:
DateHelper::fillMissingDays($queryBuilder, 'created_at', $start, $end, 'count') - 内部自动执行分组统计 + 日期补零,返回结构化数组
- 适用于订单、用户注册、日志等多种场景











