* * * * *
[TOC]
## 简介
当你在创建 JSON API 的时候,经常会需要将模型和关联转换成数组或 JSON。Eloquent 提供了一些便捷的方法来让我们可以完成这些转换,以及控制哪些属性需要被包括在序列化中。
## 序列化模型 & 集合
### 序列化成数组
如果要将模型还有其加载的 [关联](https://laravel-china.org/docs/laravel/5.4/eloquent-relationships) 转换成一个数组,则可以使用 toArray 方法。这个方法是递归的,因此,所有属性和关联(包含关联中的关联)都会被转换成数组:
~~~
$user = App\User::with('roles')->first();
return $user->toArray();
~~~
你也可以将整个 [集合](https://laravel-china.org/docs/laravel/5.4/eloquent-collections) 转换成数组:
~~~
$users = App\User::all();
return $users->toArray();
~~~
### 序列化成 JSON
如果要将模型转换成 JSON,则可以使用 `toJson` 方法。如同 `toArray` 方法一样,`toJson` 方法也是递归的。因此,所有的属性以及关联都会被转换成 JSON:
~~~
$user = App\User::find(1);
return $user->toJson();
~~~
或者,你也可以强制把一个模型或集合转型成一个字符串,它将会自动调用 `toJson` 方法:
~~~
$user = App\User::find(1);
return (string) $user;
~~~
当模型或集合被转型成字符串时,模型或集合便会被转换成 `JSON` 格式,因此你可以直接从应用程序的路由或者控制器中返回 `Eloquent` 对象:
~~~
Route::get('users', function () {
return App\User::all();
});
~~~
## 隐藏来自 JSON 的属性
有时候你可能会想要限制包含在模型数组或 JSON 表示中的属性,比如说密码。则可以通过在模型中增加 `$hidden` 属性定义来实现:
~~~
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 在数组中想要隐藏的属性。
*
* @var array
*/
protected $hidden = ['password'];
}
~~~
> {note} 当你要对关联进行隐藏时,需使用关联的 **方法** 名称,而不是它的动态属性名称。
另外,你也可以使用 `visible` 属性来定义应该包含在你的模型数组和 JSON 表示中的属性白名单。白名单外的其他属性将隐藏,不会出现在转换后的数组或 JSON 中:
~~~
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 在数组中可见的属性。
*
* @var array
*/
protected $visible = ['first_name', 'last_name'];
}
~~~
#### 临时修改属性的可见度
你可以在模型实例后使用 `makeVisible` 方法来显示通常隐藏的属性,且为了便于使用,`makeVisible` 方法会返回一个模型实例:
~~~
return $user->makeVisible('attribute')->toArray();
~~~
相应的,你可以在模型实例后使用 `makeHidden` 方法来隐藏通常显示的属性:
~~~
return $user->makeHidden('attribute')->toArray();
~~~
## 添加参数到 JSON 中
有时候,在转换模型到 数组 或 JSON 时,你希望添加一个在数据库中没有对应字段的属性。首先你需要为这个值定义一个 [访问器](https://laravel-china.org/docs/laravel/5.4/eloquent-mutators) :
~~~
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 为用户获取管理者的标记。
*
* @return bool
*/
public function getIsAdminAttribute()
{
return $this->attributes['admin'] == 'yes';
}
}
~~~
访问器创建成功后,只需添加该属性到改模型的 `appends` 属性中。注意,属性名称通常遵循 「[Snake Case](https://en.wikipedia.org/wiki/Snake_case)」 的命名方式,即是访问器的名称是基于 「[Camel Case](https://en.wikipedia.org/wiki/Camel_case)」 的命名方式。
~~~
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 访问器被附加到模型数组的形式。
*
* @var array
*/
protected $appends = ['is_admin'];
}
~~~
一旦属性被添加到 `appends` 清单,便会将模型中的数组和 JSON 这两种形式都包含进去。在 `appends` 数组中的属性也遵循模型中 `visible` 和 `hidden` 设置。
- 前言
- 翻译说明
- 发行说明
- 升级说明
- 贡献导引
- 入门指南
- 安装
- 配置信息
- 文件夹结构
- 请求周期
- 开发环境部署
- Homestead
- Valet
- 核心概念
- 服务容器
- 服务提供者
- Facades
- Contracts
- HTTP层
- 路由
- 中间件
- CSRF 保护
- 控制器
- 请求
- 响应
- 视图
- Session
- 表单验证
- 前端
- Blade 模板
- 本地化
- 前端指南
- 编辑资源 Mix
- 安全
- 用户认证
- Passport OAuth 认证
- 用户授权
- 加密解密
- 哈希
- 重置密码
- 综合话题
- Artisan 命令行
- 广播系统
- 缓存系统
- 集合
- 错误与日志
- 事件系统
- 文件存储
- 辅助函数
- 邮件发送
- 消息通知
- 扩展包开发
- 队列
- 任务调度
- 数据库
- 快速入门
- 查询构造器
- 分页
- 数据库迁移
- 数据填充
- Redis
- Eloquent ORM
- 快速入门
- 模型关联
- Eloquent 集合
- 修改器
- 序列化
- 测试
- 快速入门
- HTTP 测试
- 浏览器测试 Dusk
- 数据库测试
- 测试模拟器
- 官方扩展包
- Cashier 交易工具包
- Envoy 部署工具
- Scout 全文搜索
- Socialite 社会化登录