在Eloquent中使用groupBy获得每组更多行

时间:2015-08-13 01:09:41

标签: mysql laravel laravel-5 eloquent

我试图编写一个雄辩的查询,每个组最多返回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();会返回一个包含三个对象的数组(现在缺少一个组)。

到目前为止,我已经通过制作四个单独的数据库查询来实现这一目标,四种类型中的每一种都有一个,但如果可以在一个中完成,我更喜欢它。有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:3)

您可以实现目标的方法之一是:

Deal:where('status', 'active')
    ->get()
    ->groupBy('type')
    ->map(function($deal) {
        return $deal->take(3);
    });

当然,您需要检查查询是否返回nullempty个对象,请注意该查询将返回所有活动 Deal(s )(过滤发生在Collection),如果有很多Deal(s),这可能是无效的

答案 1 :(得分:1)

您应该在集合上调用groupBy,而不是查询:

Deal::where('status', 'active')->get()->groupBy('type');

要限制查询本身仅返回每组最多3个,请参阅您在原始问题中链接到的文章。