You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:15:36