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

Laravel视图传参与分组查询修复:车牌统计报表异常问题

问题分析与修复方案

核心问题点

  1. 关联条件错误:左连接repair和ports时,关联条件写成表自身字段相等,无法正确关联表单与对应车辆的维修、港口费用数据。
  2. 分组逻辑错误:groupBy包含form.endKm和kilometrage,导致分组基于单条记录的里程数据,而非按车牌统一汇总,新增车牌后分组混乱。
  3. 汇总值计算错误:直接使用全局汇总变量,所有车辆显示的都是全量数据总和,而非单辆车的分组统计值。
  4. 里程与成本计算逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:05:33