Laravel Collection上有多个groupBy

时间:2015-05-26 21:10:22

标签: php laravel group-by eloquent

我试图用Laravel 5中的两个子句对一个集合进行分组,但它只是按照第一个对它进行分组。有人可以帮帮我吗?这是我的代码。

$query = Activity::all()->groupBy('performed_at_year_month', 'performer_id')->toJson();

4 个答案:

答案 0 :(得分:30)

我认为https://stackoverflow.com/a/30469061/221745中的解决方案可以改进。关键是要记住按集合分组是集合的集合。因此,以下内容将起作用:

$ unzip myLib.aar -d tempFolder # or other extracting tool
# Change whatever you need
$ jar cvf myNewLib.aar -C tempFolder/ .

<?php $recs = new \Illuminate\Database\Eloquent\Collection($query); $grouped = $recs->groupBy('performed_at_year_month')->transform(function($item, $k) { return $item->groupBy('performer_id'); }); 包含您的最终结果

答案 1 :(得分:6)

您可以尝试将它们链接起来,但我不确定它会为您提供所需的结果。可能想检查以确定

$query = Activity::all()->groupBy('performed_at_year_month')->groupBy('performer_id')->toJson();

我刚刚检查了这个,你说的是正确的,它不是保留键,虽然我想我可以猜到为什么。如果一个密钥碰巧是相同的,那么事情就会被覆盖。也许很难确定哪个键是什么,总体感觉有点“hacky”可能有更好的解决方案。

但是,我想我已经想出了如何做到这一点。

$query = Activity::all();
$activities = new \Illuminate\Database\Eloquent\Collection($query);
$activities = $activities->groupBy('performed_at_year_month')->toArray() + $activities->groupBy('performer_id')->toArray();
echo json_encode($activities);

答案 2 :(得分:2)

Laravel 现在(自 5.5.29 起)支持多级嵌套分组,如 https://christoph-rumpel.com/2018/1/groupby-multiple-levels-in-laravel

$query = Activity::all()->groupBy(['performed_at_year_month', 'performer_id'])->toJson();

答案 3 :(得分:1)

您可以传递回调,而不是传递字符串键。回调应返回您希望通过以下方式键入组的值:

$collection->groupBy(function($item, $key){
            return $item["key-1"]."-".$item["key-2"];
        });

参考:-https://laravel.com/docs/5.7/collections#method-groupby