You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:45:05