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

Laravel中如何通过单条查询实现GroupBy分组并聚合Sum到对象(无需合并操作)

如何用单条Laravel查询实现GroupBy并获取指定列总和?

当然可行!你写的第一段代码其实就是完美的单条查询解决方案,完全不需要拆分或者合并多次查询。

先给你明确说:$Todo = Todo::selectRaw('sum(estimated_time) as amount')->groupBy('user_name')->get(); 这条语句直接在数据库层面完成了分组和求和操作,这是最高效的方式——数据库对聚合计算有原生优化,比先拉取所有数据到PHP再处理要快得多,尤其是数据量大的时候。

咱们对比下你两段代码的区别:

  • 第一段:数据库执行分组后,直接计算每组的estimated_time总和,返回的结果集就是每个user_name对应的总和数据,数据量小、性能优。
  • 第二段:$Todo = Todo::get()->groupBy('user_name'); 是先把所有Todo记录加载到内存的Laravel集合里,再做分组。这种方式不仅会占用更多内存,你还得额外遍历每个分组去手动计算总和,多了完全没必要的步骤。

如果你想在结果里同时拿到user_name字段(毕竟只有总和的话,你可能不知道对应哪个用户),可以稍微调整下查询:

$Todo = Todo::selectRaw('user_name, sum(estimated_time) as amount')
           ->groupBy('user_name')
           ->get();

这样返回的每个结果对象里就会包含user_name和对应的amount(时间总和),直接用就行。

另外要注意:如果你的数据库开启了严格模式(比如MySQL的严格SQL模式),groupBy的字段必须和select里的非聚合字段对应,所以上面把user_name加到selectRaw里是必要的,避免出现SQL报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:19:06