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

Laravel如何同时统计主表与关联表的分组求和数据?

主表与关联表分组求和的正确实现方式

你的原查询存在两个核心问题:

  1. 使用with()预加载关联表时,关联查询的分组是针对整个Weaning表的全局求和,无法和主表按date_of_delivery的分组结果对应,最终得到的断奶数据不是对应每个交付日期的总和。
  2. selectRaw('*, sum(pups_born)')在MySQL严格模式下会报错,因为groupBy仅指定了date_of_delivery,但select *包含了其他未聚合、未分组的字段。

方案一:左连接(Left Join)实现高效分组求和

这种方式通过一次关联查询完成所有统计,性能最优,同时能兼容无断奶记录的交付数据(用COALESCE将null转为0):

Delivery::leftJoin('weanings', 'deliveries.id', '=', 'weanings.delivery_id')
    ->selectRaw('
        deliveries.date_of_delivery,
        SUM(deliveries.pups_born) as total_pups_born,
        COALESCE(SUM(weanings.weaned_male), 0) as total_weaned_male,
        COALESCE(SUM(weanings.weaned_female), 0) as total_weaned_female
    ')
    ->groupBy('deliveries.date_of_delivery')
    ->orderBy('deliveries.date_of_delivery', 'desc')
    ->get();

说明:

  • leftJoin确保即使某条交付记录没有对应的断奶数据,也会被保留在结果中。
  • COALESCE函数处理断奶数据为null的情况,将其转为0,避免统计结果出现null值。
  • 仅在select中保留分组字段和聚合结果,符合SQL严格模式的要求。

方案二:子查询+集合映射(适合复杂关联场景)

如果不想使用关联查询,可以通过子查询先获取单条交付记录的断奶总和,再按日期汇总:

$results = Delivery::selectRaw('
    date_of_delivery,
    SUM(pups_born) as total_pups_born,
    (SELECT COALESCE(SUM(weaned_male), 0) FROM weanings WHERE weanings.delivery_id = deliveries.id) as delivery_weaned_male,
    (SELECT COALESCE(SUM(weaned_female), 0) FROM weanings WHERE weanings.delivery_id = deliveries.id) as delivery_weaned_female
')
->groupBy('date_of_delivery')
->orderBy('date_of_delivery', 'desc')
->get();

// 对每个日期下的断奶数据再次求和
$finalResults = $results->map(function ($item) {
    return [
        'date_of_delivery' => $item->date_of_delivery,
        'total_pups_born' => $item->total_pups_born,
        'total_weaned_male' => $item->sum('delivery_weaned_male'),
        'total_weaned_female' => $item->sum('delivery_weaned_female'),
    ];
});

说明:

  • 子查询会为每条交付记录计算对应的断奶总和,再通过map方法按日期汇总这些值。
  • 这种方式性能略低于关联查询,适合关联逻辑复杂、无法直接用join实现的场景。

内容的提问来源于stack exchange,提问作者B L Praveen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:35:10