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

Laravel Query Builder使用GroupBy无法获取全部记录问题

问题根源与解决方案

这事儿我太熟了!你这是把**数据库层面的groupBy和Laravel集合的groupBy**搞混啦,两者的作用完全不一样:

为啥当前查询只返回2条记录?

你现在用的是数据库原生的groupBy('type'),它的核心作用是做聚合统计——比如统计每个type有多少条交易、总金额是多少这类需求。数据库执行这个语句时,会把相同type的记录合并成一组,然后只返回每组的一条聚合结果(比如默认取每组的第一条,或者根据聚合函数返回统计值),所以你表中有10多条记录,但最终只拿到每个type各一条的结果。

而且如果你的MySQL开启了ONLY_FULL_GROUP_BY模式(现在默认是开启的),你原来的查询其实是不符合SQL规范的:因为你select了所有字段,但groupBy只指定了type,数据库无法确定其他字段该返回哪一条的值,大概率会返回每组里的随机一条记录,这就进一步导致你拿不到完整的所有记录。

怎么实现按type分成两个结果集?

你想要的是把筛选后的所有交易数据,按type归类成两个集合(每个type下包含它对应的所有原始记录),这时候应该用Laravel集合的groupBy方法,步骤很简单:

  1. 先查询出所有符合条件的交易记录(不要加数据库的groupBy)
  2. 用集合的groupBy方法对结果按type分组

修改后的代码如下:

// 第一步:获取所有符合筛选条件的交易记录
$allTransactions = DB::table($this->table)
    ->select()
    ->whereRaw($where['rawQuery'], $where['bindParams'] ?? [])
    ->get();

// 第二步:用集合的groupBy按type分组,得到每个type对应的所有记录
$groupedByType = $allTransactions->groupBy('type');

这样处理后,$groupedByType就是你需要的结构:

  • $groupedByType[1] 会包含所有type=1的交易记录
  • $groupedByType[2] 会包含所有type=2的交易记录

你可以直接遍历这个分组后的集合,或者根据type键值直接取出对应组的所有数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:54:19