提问者:小点点

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


我正在开发一个小型应用程序,使用Laravel 5.8作为狗收容所。

我在我的狗模型中有一个查询,检索我感兴趣的狗品种:

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()结合使用,但无法获得所需的输出。


共1个答案

匿名用户

首先按名称对$collection进行分组
然后为每个找到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')),
        ]; 
    ];
});