我试图编写一个雄辩的查询,每个组最多返回3行(使用groupBy)。 This post is similar但我不确定如何在此处应用该解决方案。
我的MySQL表交易有一个雄辩的模型Deal
。每笔交易可以有四个types
中的一个,因此最终应该最多有四个组(如果某个type
没有交易,则最少可以。)
我尝试了Deal::where('status', 'active')->groupBy('type')->get();
,这会返回一个包含四个对象的数组(四种类型中的每一种都有一个交易),但我期待12次交易,每组3次(并且它们确实存在于数据库中)。同样,尝试Deal::where('status', 'active')->groupBy('type')->take(3)->get();
会返回一个包含三个对象的数组(现在缺少一个组)。
到目前为止,我已经通过制作四个单独的数据库查询来实现这一目标,四种类型中的每一种都有一个,但如果可以在一个中完成,我更喜欢它。有什么想法吗?谢谢!
答案 0 :(得分:3)
您可以实现目标的方法之一是:
Deal:where('status', 'active')
->get()
->groupBy('type')
->map(function($deal) {
return $deal->take(3);
});
当然,您需要检查查询是否返回null
或empty
个对象,请注意该查询将返回所有活动 Deal
(s )(过滤发生在Collection
),如果有很多Deal
(s),这可能是无效的
答案 1 :(得分:1)
您应该在集合上调用groupBy
,而不是查询:
Deal::where('status', 'active')->get()->groupBy('type');
要限制查询本身仅返回每组最多3个,请参阅您在原始问题中链接到的文章。