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

Laravel分组订单数据传递至Chart.js实现月度总价展示

解决Laravel分组数据传递到Chart.js展示月度总价的问题

我来帮你一步步搞定这个需求,从后端数据处理到前端Chart.js渲染,全流程给你理清楚:

第一步:后端处理分组数据,计算月度总价

你现在的代码已经按月份完成了分组,但每个分组里是该月的所有订单集合,我们需要先把每个月的订单总价计算出来:

// 1. 按月份分组并计算每个月的总价
$result = Order::where('user_id', Auth::id())
    ->get(['created_at', 'price']) // 这里id字段用不到,可以去掉
    ->groupBy(function($order) {
        return Carbon::parse($order->created_at)->format('m'); // 按月份数字分组,比如01、02...
    })
    ->map(function($monthlyOrders) {
        return $monthlyOrders->sum('price'); // 计算当前月份的订单总价
    });

// 2. 整理成Chart.js需要的labels和data格式
// 生成月份标签(可以改成中文,比如'1月'、'2月',或者英文'January')
$monthLabels = $result->keys()->map(function($monthNum) {
    // 转成中文月份:Carbon::create()->month($monthNum)->format('m月');
    // 转成英文月份:Carbon::create()->month($monthNum)->format('F');
    return Carbon::create()->month($monthNum)->format('m月'); 
})->toArray();

// 提取对应的月度总价数组
$monthlyTotals = $result->values()->toArray();

// 3. 把数据传递到视图
return view('your-page-name', compact('monthLabels', 'monthlyTotals'));

可选优化:补全缺失月份的数据

如果某些月份没有订单,分组结果里会缺少这些月份,导致图表显示不完整。可以补全年12个月的数据,缺失月份总价设为0:

// 生成全年12个月份的数字数组(01-12)
$allMonths = collect(range(1, 12))->map(function($month) {
    return str_pad($month, 2, '0', STR_PAD_LEFT);
});

// 补全缺失月份的总价为0
$filledTotals = $allMonths->map(function($month) use ($result) {
    return $result->get($month, 0);
});

// 生成对应的完整月份标签
$completeMonthLabels = $allMonths->map(function($monthNum) {
    return Carbon::create()->month($monthNum)->format('m月');
})->toArray();

// 传递补全后的数据到视图
return view('your-page-name', compact('completeMonthLabels', 'filledTotals'));

第二步:前端用Chart.js渲染图表

在你的Blade视图文件中,先引入Chart.js,然后利用后端传递的数据初始化图表:

<!-- 1. 引入Chart.js(可以用CDN,或者本地引入) -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

<!-- 2. 准备图表画布 -->
<div style="width: 80%; margin: 0 auto;">
    <canvas id="monthlySalesChart"></canvas>
</div>

<!-- 3. 初始化Chart.js图表 -->
<script>
    document.addEventListener('DOMContentLoaded', function() {
        const ctx = document.getElementById('monthlySalesChart').getContext('2d');
        
        new Chart(ctx, {
            type: 'bar', // 可以改成'line'(折线图)、'pie'(饼图)等
            data: {
                labels: {!! json_encode($completeMonthLabels ?? $monthLabels) !!}, 
                datasets: [{
                    label: '月度销售总价',
                    data: {!! json_encode($filledTotals ?? $monthlyTotals) !!},
                    backgroundColor: 'rgba(75, 192, 192, 0.2)',
                    borderColor: 'rgba(75, 192, 192, 1)',
                    borderWidth: 1
                }]
            },
            options: {
                responsive: true,
                scales: {
                    y: {
                        beginAtZero: true,
                        title: {
                            display: true,
                            text: '总价(元)'
                        }
                    },
                    x: {
                        title: {
                            display: true,
                            text: '月份'
                        }
                    }
                }
            }
        });
    });
</script>

关键注意点

  • 用{!! json_encode() !!}来传递PHP数组到JS,因为Blade的{{ }}会转义HTML字符,导致JS无法正确解析数组。
  • 如果你的项目已经安装了Chart.js的npm包,可以直接import使用,不用CDN。
  • 可以根据需求调整图表的类型、颜色、标题等配置项,按需修改即可。

内容的提问来源于stack exchange,提问作者Cathrine91

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:00:28