获取 Laravel 中每个不同项目名称的最小值和最大值的集合项目

0 collections laravel laravel-collection

我正在开发一个使用 Laravel 5.8 的小型应用程序作为狗收容所。

\n\n

我的 Dog 模型中有一个查询,它检索我感兴趣的狗品种:

\n\n
public function getBreeds()\n    {\n        return $collection = DB::table(\'dogs\')->whereIn(\'name\', [\'Breed1\', \'Breed2\', \'Breed3\', \'Breed4\'])->get();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到了一个包含大约 100 个项目的集合,如下所示:

\n\n
Collection {#373 \xe2\x96\xbc\n  #items: array:100 [\xe2\x96\xbc\n    0 => {#380 \xe2\x96\xbc\n      +"id": 1792\n      +"join_date": "2019-03-21 07:40"\n      +"name": "Breed1"\n      +"age": 9.3\n    }\n    1 => {#382 \xe2\x96\xbc\n      +"id": 1801\n      +"join_date": "2019-03-21 09:35"\n      +"name": "Breed2"\n      +"age": 29.1\n    }\n    2 => {#372 \xe2\x96\xbc\n      +"id": 1803\n      +"join_date": "2019-03-21 14:10"\n      +"name": "Breed3"\n      +"age": 60.9\n    }\n    3 => {#385 \xe2\x96\xbc\n      +"id": 1805\n      +"join_date": "2019-03-21 14:12"\n      +"name": "Breed4"\n      +"age": 0.7\n    }\n    4 => {#386 \xe2\x96\xbc\n      +"id": 1806\n      +"join_date": "2019-03-21 14:14"\n      +"name": "Breed1"\n      +"age": 75.4\n    }\n    5 => {#387 \xe2\x96\xbc\n      +"id": 2872\n      +"join_date": "2019-03-21 16:07"\n      +"name": "Breed2"\n      +"age": 9.5\n    }\n    6 => {+"name": "Breed3"}\n    7 => {+"name": "Breed4"}\n    8 => {+"name": "Breed1"}\n    9 => {+"name": "Breed2"}\n    10 => {+"name": "Breed3"}\n    100 => {}\n  ]\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

我需要为每个品种获取年龄最低和最高的两个收藏品。 这应该会产生 4 个不同品种(如查询的)的 8 个项目的集合,其中包含每个品种中最年轻和最年长的狗。

\n\n

我尝试过使用filter()或与andeach()结合使用,但无法获得所需的输出。min()max()

\n

Tha*_*han 7

首先按$collection名称分组。
然后为每个group找到maxmin对象。

示例代码

$collection->groupBy('name')->map(function($group, $groupName) {
    return [
        'name' => $groupName,
        'dogs' => [
            'min' => $group->firstWhere('age', $group->min('age')),
            'max' => $group->firstWhere('age', $group->max('age')),
        ]; 
    ];
});
Run Code Online (Sandbox Code Playgroud)