序列化

未匹配的标注
本文档最新版为 10.x,旧版本可能放弃维护,推荐阅读最新版!

Eloquent: 序列化

简介

当你在创建 JSON API 的时候,经常会需要将模型和关联转换成数组或 JSON。Eloquent 提供了一些便捷的方法来让我们可以完成这些转换,以及控制哪些属性需要被包括在序列化中。

基本用法

将模型转换成一个数组

如果要将模型还有其加载的 关联 转换成一个数组,则可以使用 toArray 方法。这个方法是递归的,因此,所有属性和关联(包含关联中的关联)都会被转换成数组:

$user = App\User::with('roles')->first();

return $user->toArray();

你也可以将 集合 转换成数组:

$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'];
}

注意:当你要对关联进行隐藏时,需使用关联的 方法 名称,而不是它的动态属性名称。

另外,你也可以使用 visible 属性来定义应该包含在你的模型数组和 JSON 表示中的属性白名单:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 在数组中可见的属性。
     *
     * @var array
     */
    protected $visible = ['first_name', 'last_name'];
}

添加一些值到 JSON

有时候,你可能需要添加在数据库中没有对应字段的数组属性。首先你需要为这个值定义一个 访问器

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 为用户获取管理者的标记。
     *
     * @return bool
     */
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] == 'yes';
    }
}

一旦访问器创建成功,就可以将属性名称添加到模型的 appends 属性:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * 访问器被附加到模型数组的形式。
     *
     * @var array
     */
    protected $appends = ['is_admin'];
}

一旦属性被添加到 appends 清单,便会将模型中的数组和 JSON 这两种形式都包含进去。在 appends 数组中的属性也遵循模型中 visiblehidden 设置。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
发起讨论 只看当前版本


_Fairy
如何按追加的 JSON 值进行排序
1 个点赞 | 7 个回复 | 问答 | 课程版本 5.7