Получить элемент коллекции с минимальным и максимальным значением для каждого отдельного имени элемента в Laravel - PullRequest
0 голосов
/ 14 апреля 2019

Я работаю над небольшим приложением, использующим 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 Ответ

1 голос
/ 14 апреля 2019

Первая группа $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')),
        ]; 
    ];
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...