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
相关产品推荐
相关产品推荐

