首页 > 解决方案 > 获取 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 个不同品种(如查询)的 8 个项目的集合,其中每个品种中最年轻和最年长的狗。

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

标签: laravelcollectionslaravel-collection

解决方案


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

示例代码

$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')),
        ]; 
    ];
});

推荐阅读