Laravel查询admin角色用户返回嵌套对象而非数组的问题
问题原因
- 你当前的写法先调用
User::all()取出全表用户生成集合,再在集合上执行where过滤,过滤操作只会移除不符合条件的元素,不会重置集合的原有索引 - 当过滤后集合的索引是从0开始的连续整数时,序列化为JSON就会输出普通数组格式,对应你获取user用户时的正常返回效果
- 当过滤后集合的索引不连续、或者不是从0起始时,序列化为JSON就会输出键值对对象格式,对应你获取admin用户时的异常返回效果
- 额外注意:先查全表再在内存中过滤的写法性能极差,数据量稍大就会严重拖慢接口响应,属于不推荐的错误用法
修复方案
最优方案(推荐)
将过滤条件放到SQL查询层面执行,查询得到的集合默认索引就是从0开始的连续值,同时也能大幅提升查询性能:
public function getAllUsers(Request $request){ $users = User::where('role', 'user')->get(); return $users; } public function getAllAdmins(Request $request){ $admins = User::where('role', 'admin')->get(); return $admins; }
兼容方案(适用于必须在集合上过滤的场景)
如果你的业务逻辑确实需要先取出全量集合再做过滤,过滤后调用values()方法重置集合索引即可:
// 示例写法 $admins = User::all()->where('role', 'admin')->values();
values()方法会重新生成从0开始的连续整数索引,无论过滤前的索引状态如何,序列化后都会输出符合预期的数组格式。
内容的提问来源于stack exchange,提问作者Moemen Hussein
相关产品推荐
相关产品推荐

