在Laravel里,Eloquent模型不仅能方便地从数据库读取数据,还内置了序列化机制,可以把模型或模型集合转成数组和JSON。掌握这些方式,能让你在写接口时更轻松地处理数据输出。

一、使用toArray方法转为数组
如果你拿到了一个模型实例或者模型集合,可以直接调用toArray方法,得到一个普通的PHP数组,这个数组再被框架响应时就会变成JSON数组。
<?php
// 获取单个模型并转为数组
$user = AppModelsUser::find(1);
$array = $user->toArray();
// 获取模型集合并转为数组(多维数组,输出即为JSON数组)
$users = AppModelsUser::where('status', 1)->get();
$list = $users->toArray();
// 在控制器中直接返回,Laravel会自动序列化为JSON数组
return response()->json($list);
二、使用toJson输出JSON字符串
当您需要手动拿到JSON字符串而不是数组时,可以调用toJson方法,它内部调用了PHP的json_encode。
<?php
$user = AppModelsUser::find(1);
$json = $user->toJson();
// 直接返回字符串,框架会设置正确的Content-Type
return response($json)->header('Content-Type', 'application/json');
三、隐藏字段与追加属性
数据库里的密码、令牌等敏感信息不应出现在JSON数组里。可以在模型中使用$hidden属性隐藏,用$appends和getXxxAttribute方法追加计算字段。
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class User extends Model
{
// 隐藏敏感字段
protected $hidden = ['password', 'remember_token'];
// 追加自定义属性到数组和JSON
protected $appends = ['full_name'];
// 定义追加属性的访问器
public function getFullNameAttribute()
{
return $this->first_name . ' ' . $this->last_name;
}
}
四、使用API资源更灵活地控制输出
当接口需要固定格式时,推荐使用Laravel的API Resource。它可以把模型映射成你想要的数组结构,避免把数据表字段直接暴露。
<?php
namespace AppHttpResources;
use IlluminateHttpResourcesJsonJsonResource;
class UserResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->full_name,
'email' => $this->email,
];
}
}
在控制器中把模型集合传给资源类的collection方法,就能得到干净的JSON数组响应。
<?php use AppHttpResourcesUserResource; use AppModelsUser; $users = User::all(); return UserResource::collection($users);
五、常见问题小结
- 直接return模型集合时,Laravel会自动调用toArray并转成JSON数组。
- 若关系未加载,序列化时不会包含关联数据,可用with提前预加载。
- 日期字段默认转成ISO格式字符串,可在模型中用$casts修改。
合理运用模型序列化,不仅能减少手工拼数组的工作量,也能让接口数据结构更清晰可控。