我正在使用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()
结合使用,但无法获得所需的输出。
答案 0 :(得分:1)
首先按名称对$collection
进行分组。
然后为每个group
找到max
和min
对象。
示例代码
$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')),
];
];
});