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

Laravel:多列相乘后求和的关联查询实现问题

解决Laravel中关联表计算乘积之和的查询问题

嘿,我来帮你把这个查询补全并修正!你的需求是关联particulars和reqs表,计算price与quantity_issued的乘积总和,原代码的问题主要是groupBy部分不完整,而且要注意MySQL的分组规则(默认开启ONLY_FULL_GROUP_BY),下面是完整的正确实现:

$particulars = DB::table('particulars as A')
    ->leftJoin('reqs as B', function ($join) {
        $join->on('A.particular_id', '=', 'B.particular_id');
    })
    ->whereBetween('B.date_issued', [$start_date, $end_date])
    ->select(
        'A.particular_id',
        'A.item_name',
        'A.unit',
        'A.price',
        DB::raw('SUM(B.quantity_issued) as total_quantity'), // 可选:统计该物料的总发出数量
        DB::raw('SUM(A.price * B.quantity_issued) as total_cost')
    )
    ->groupBy('A.particular_id', 'A.item_name', 'A.unit', 'A.price')
    ->get();

关键说明:

  • 分组规则:因为MySQL默认开启ONLY_FULL_GROUP_BY模式,所以select里所有非聚合函数的字段(比如item_name、unit)都必须加入groupBy。这里用A.particular_id作为核心分组字段(它是物料的唯一标识),再加上其他属性字段,保证分组结果的准确性。
  • 聚合处理:直接把B.quantity_issued放在select里会返回随机值(分组后无法确定取哪一条的数量),如果需要统计总发出数量,用SUM(B.quantity_issued);如果不需要这个字段,可以直接删掉。
  • 左连接的特性:用leftJoin会保留所有particulars表的记录,即使某个物料没有对应的reqs数据,total_cost会返回0。如果只想统计有过发出记录的物料,把leftJoin改成join(内连接)即可。
  • 日期格式:确保$start_date和$end_date是合法的日期格式(比如Carbon实例或者'YYYY-MM-DD'字符串),否则whereBetween无法正确筛选数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:39:51