Я работаю над небольшим приложением, использующим 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(), но не могу получить желаемый результат.






Сначала сгруппируйте $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')),
];
];
});