为 Laravel 中的每个不同项目名称获取具有最小值和最大值的 collection 项目
Get the collection item with the minimum and maximum value for each distinct item name in Laravel
我正在使用 Laravel 5.8 开发一个狗收容所的小应用程序。
我在我的 Dog 模型中有一个查询,它检索我感兴趣的犬种:
public function getBreeds()
{
return $collection = DB::table('dogs')->whereIn('name', ['Breed1', 'Breed2', 'Breed3', 'Breed4'])->get();
}
我得到一个 collection 大约有 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 => {}
]
}
我需要获取两个collection项 每个年龄最低和最高的品种。这将导致 collection 包含 4 个不同品种的八个项目(根据查询),每个品种中最年轻和最年长的狗。
我已经尝试将 filter()
或 each()
与 min()
和 max()
结合使用,但无法获得所需的输出。
首先按名称将 $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')),
];
];
});
我正在使用 Laravel 5.8 开发一个狗收容所的小应用程序。
我在我的 Dog 模型中有一个查询,它检索我感兴趣的犬种:
public function getBreeds()
{
return $collection = DB::table('dogs')->whereIn('name', ['Breed1', 'Breed2', 'Breed3', 'Breed4'])->get();
}
我得到一个 collection 大约有 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 => {}
]
}
我需要获取两个collection项 每个年龄最低和最高的品种。这将导致 collection 包含 4 个不同品种的八个项目(根据查询),每个品种中最年轻和最年长的狗。
我已经尝试将 filter()
或 each()
与 min()
和 max()
结合使用,但无法获得所需的输出。
首先按名称将 $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')),
];
];
});