laravel - 获取 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()
解决方案
首先$collection
按名称分组。
然后为每个group
找到max
andmin
对象。
示例代码
$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')),
];
];
});
推荐阅读
- vue.js - 使用 nuxt-link 与 router-link 相比有什么优势?
- scala - 为什么带有扩展方法的代码可以编译?
- excel - 使用高级过滤器加速从 VBA 中的另一个工作表复制
- python - 打印 Cython Memoryview
- python - 如何按工作日订购我的行的数据集
- r - 使用 R 中的线性插值计算 data.frame 每一行的值?
- identityserver4 - 来自 4.0.0 版文档的示例中的 Identity Server 无效范围
- python - If、if-else 和 elif 语句
- ios - SwiftUI 地图显示注解
- next.js - Next.js 动态路由加载不存在的脚本导致 404