在Laravel中如何按age分组查询结果并输出指定键名的JSON格式
实现方案
直接调用groupBy只能得到以年龄为键、对应年龄用户列表为值的集合,和你需要的结构不符,需要额外对分组结果做一次转换,参考代码如下:
// 适合所有Laravel版本的写法 $userGroup = User::select('id', 'name', 'age') ->get() ->groupBy('age') ->map(function ($userItems, $age) { return [ 'age' => $age, 'user' => $userItems->map(function ($item) { return $item->only(['id', 'name']); }) ]; }) ->values(); // 直接返回响应的话Laravel会自动转成符合要求的JSON return $userGroup; // 如果需要手动拿到JSON字符串可以调用toJson() // $jsonResult = $userGroup->toJson();
如果是Laravel 7及以上版本,支持箭头函数可以简化写法:
$userGroup = User::select('id', 'name', 'age') ->get() ->groupBy('age') ->map(fn($userItems, $age) => [ 'age' => $age, 'user' => $userItems->map(fn($item) => $item->only(['id', 'name'])) ]) ->values();
代码说明
select('id', 'name', 'age')提前指定查询字段,避免查询冗余字段,提升性能groupBy('age')按年龄字段完成分组map遍历分组结果,将每个分组重构成你需要的age+user结构,同时过滤用户字段只保留id和namevalues()重置分组后的关联键为数字索引,保证转JSON后是数组格式而非对象格式
内容的提问来源于stack exchange,提问作者Ye Htun Z
相关产品推荐
相关产品推荐

