Laravel视图传参与分组查询修复:车牌统计报表异常问题
问题分析与修复方案
核心问题点
- 关联条件错误:左连接
repair和ports时,关联条件写成表自身字段相等,无法正确关联表单与对应车辆的维修、港口费用数据。 - 分组逻辑错误:
groupBy包含form.endKm和kilometrage,导致分组基于单条记录的里程数据,而非按车牌统一汇总,新增车牌后分组混乱。 - 汇总值计算错误:直接使用全局汇总变量,所有车辆显示的都是全量数据总和,而非单辆车的分组统计值。
- 里程与成本计算逻辑错误:
totalKm未按分组累加,costKM运算顺序和变量引用错误,导致每公里成本计算异常。
修复后的Controller代码
public function index(Request $request, Repair $repairModel, Form $formModel, Ports $portsModel) { $queryFinal = DB::table("form") ->selectRaw(" form.carPlate, SUM(form.endKm - form.kilometrage) AS totalKMs, (100 * SUM(form.liters_charged)) / SUM(form.endKm - form.kilometrage) AS average100, SUM(form.euros_charged) AS totalEurosCharged, COALESCE(SUM(repair.valor), 0) AS totalrep, COALESCE(SUM(ports.cost), 0) + COALESCE(SUM(form.portsEuro), 0) AS totalPorts, (SUM(form.euros_charged) + COALESCE(SUM(repair.valor), 0) + COALESCE(SUM(ports.cost), 0) + COALESCE(SUM(form.portsEuro), 0)) / SUM(form.endKm - form.kilometrage) AS costKM ") ->leftJoin('repair', 'repair.carPlate', '=', 'form.carPlate') ->leftJoin('ports', 'ports.carPlate', '=', 'form.carPlate') ->groupBy("form.carPlate") ->orderBy("form.carPlate") ->get(); return view('admin.form.report', compact('queryFinal')); }
修复说明
- 修正关联条件:将
repair和ports与form.carPlate关联,确保每辆车的数据正确匹配。 - 调整分组逻辑:仅保留
form.carPlate作为分组字段,实现按车牌统一汇总。 - 分组内计算汇总值:所有统计字段使用
SUM()在分组内计算,确保每个车牌对应自身的统计数据。 - 修复计算逻辑:
totalKMs改为累加每辆车的所有里程差- 用
COALESCE()处理关联表无数据的情况,避免NULL导致计算错误 - 修正
costKM运算逻辑,总费用除以总里程得到每公里成本
- 清理冗余代码:移除全局汇总变量,所有统计逻辑统一在SQL查询中完成,提升性能与准确性
Blade视图优化建议
统一字段名并添加格式化提升可读性:
<tbody> @foreach ($queryFinal as $item) <tr> <td>{{ $item->carPlate }}</td> <td>{{ $item->totalKMs }}</td> <td>{{ number_format($item->average100, 2) }}</td> <td>{{ number_format($item->totalEurosCharged, 2) }}</td> <td>{{ number_format($item->totalrep, 2) }}</td> <td>{{ number_format($item->totalPorts, 2) }}</td> <td>{{ number_format($item->costKM, 2) }}</td> </tr> @endforeach </tbody>
内容的提问来源于stack exchange,提问作者optimus899
相关产品推荐
相关产品推荐

