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

时间:2019-04-14 09:29:24

标签: laravel collections laravel-collection

我正在使用Laravel 5.8开发用于狗窝的小型应用程序。

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

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

我得到一个集合,其中包含约100个项目,如下所示:

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

我需要为年龄最低和最高的每个品种获得两个采集项目 。这将导致八个项目的集合,其中包含4个不同的品种(根据查询),每个品种中年龄最小和年龄最大的狗。

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

1 个答案:

答案 0 :(得分:1)

首先按名称对$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')),
        ]; 
    ];
});