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方法,步骤很简单:
- 先查询出所有符合条件的交易记录(不要加数据库的
groupBy) - 用集合的
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
相关产品推荐
相关产品推荐

