Получите элемент коллекции с минимальным и максимальным значением для каждого отдельного имени элемента в Laravel

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
1 860
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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')),
        ]; 
    ];
});

Другие вопросы по теме