Laravel按日期分组统计:无数据时显示0适配Chart.js折线图
解决方法
核心思路
先构建目标月份所有日期对应值为0的基础数组,再用数据库查询到的统计数据覆盖对应日期的位置,最终得到按日期顺序排列的完整数据集。
具体实现代码
use Carbon\Carbon; // 指定目标月份 $targetMonth = '2022-10'; $startOfMonth = Carbon::parse($targetMonth)->startOfMonth(); $endOfMonth = Carbon::parse($targetMonth)->endOfMonth(); // 生成当月每日的基础数组,默认计数为0 $dailyCounts = []; $currentDate = $startOfMonth->copy(); while ($currentDate->lte($endOfMonth)) { $dateKey = $currentDate->format('Y-m-d'); $dailyCounts[$dateKey] = 0; $currentDate->addDay(); } // 查询符合条件的出货统计数据 $stats = Shipment::where('company_id', 2) ->where('shipment_type', 'Export') ->whereBetween('created_at', [$startOfMonth, $endOfMonth]) ->selectRaw('DATE(created_at) as date, COUNT(*) as total') ->groupBy('date') ->pluck('total', 'date'); // 将查询到的统计数覆盖到对应日期的位置 foreach ($stats as $date => $count) { if (isset($dailyCounts[$date])) { $dailyCounts[$date] = $count; } } // 提取按日期顺序排列的数值数组,直接用于Chart.js $chartDataset = array_values($dailyCounts);
代码说明
- 用Carbon类快速获取目标月份的首尾日期,循环生成包含当月所有日期的基础数组,确保每个日期都有对应的位置且默认值为0
- 查询时通过
DATE(created_at)将时间字段转换为日期字符串,和基础数组的键保持一致,方便后续匹配 - 使用
pluck('total', 'date')直接生成以日期为键、统计数为值的集合,简化后续覆盖操作 - 最后通过
array_values()提取数组值,得到按日期顺序排列的数据集,可直接传入Chart.js的data属性中
内容的提问来源于stack exchange,提问作者Heshanmax
相关产品推荐
相关产品推荐

