Laravel中对象转数组最常用toArray()方法,它递归转换模型及关联关系,自动处理日期格式化、隐藏字段和追加属性;批量查询需调用get()->toArray();禁用(array)强转以免丢失逻辑。

在 Laravel 中,对象转数组最常用的方式是调用模型实例的 toArray() 方法,它会递归地将 Eloquent 模型及其关联关系转换为纯 PHP 数组。这个方法自动处理了日期格式化、隐藏字段、追加属性等配置,比手动 foreach 更安全可靠。
基础用法:单个模型转数组
对一个 Eloquent 模型实例直接调用 toArray():
- 支持模型本身的属性、$casts 类型转换(如 json、datetime)、$dates 格式化
- 自动忽略 $hidden 声明的字段(如 password)
- 包含 $appends 定义的访问器(如 getFullNameAttribute)
示例:
$user = User::find(1); $array = $user->toArray(); // 返回关联字段已处理的数组
批量查询结果转数组
使用集合(Collection)的 toArray() 方法:
立即学习“PHP免费学习笔记(深入)”;
- Eloquent 查询返回的是 Collection 对象,不是数组
- 调用
get()->toArray()或all()->toArray()可转为二维数组 - 注意:
toArray()在 Collection 上是递归的,会把每个模型也转成数组
示例:
$users = User::where('active', 1)->get()->toArray(); // 所有用户转为数组
自定义转换逻辑(toarray + 魔术方法)
如果需要更精细控制,可重写模型的 toArray() 或使用 attributesToArray():
attributesToArray()只处理当前模型字段,不递归关联关系- 在模型中重写
toArray(),可先调用父类再修改结构 - 配合
makeHidden()/makeVisible()动态控制字段
示例:
$user = User::with('posts')->find(1);
$user->makeHidden(['email']); // 临时隐藏 email 字段
$array = $user->toArray(); // email 不再出现在结果中
JSON 输出场景下的隐式转换
Laravel 控制器返回模型或集合时,框架会自动调用 toArray() 再转 JSON:
- return response()->json($user); → 自动触发 $user->toArray()
- return $users;(API 资源路由)→ 同样自动转换
- 如需原始数组而非 JSON,明确调用
toArray()即可
不复杂但容易忽略:别直接用 (array) $model 强转,它不会处理访问器、隐藏字段或关联模型,结果不可靠。



















