获取Laravel中每个不同项目名称的最小值和最大值的集合项

问题描述 投票:0回答:1

我正在使用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 => {}
  ]
}

我需要为每个年龄最低和最高的品种获得两个收集项目。这将导致收集8个项目,其中4个不同品种(如查询)与每个品种中最年轻和最老的狗。

我尝试将filter()each()min()max()结合使用,但我无法获得所需的输出。

laravel collections laravel-collection
1个回答
1
投票

首先按名称对$collection进行分组。 然后为每个group找到maxmin对象。

示例代码

$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')),
        ]; 
    ];
});
© www.soinside.com 2019 - 2024. All rights reserved.