Eloquent: 序列化

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

将模型转换成一个数组

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

你也可以将 转换成数组:

  1. $users = App\User::all();
  2. return $users->toArray();

将模型转换成 JSON

如果要将模型转换成 JSON,则可以使用 toJson 方法。如同 toArray 方法一样,toJson 方法也是递归的。因此,所有的属性以及关联都会被转换成 JSON:

  1. $user = App\User::find(1);
  2. return $user->toJson();

当模型或集合被转型成字符串时,模型或集合便会被转换成 JSON 格式,因此你可以直接从应用程序的路由或者控制器中返回 Eloquent 对象:

  1. Route::get('users', function () {
  2. return App\User::all();
  3. });

有时候你可能会想要限制包含在模型数组或 JSON 表示中的属性,比如说密码。则可以通过在模型中增加 $hidden 属性定义来实现:

  1. <?php
  2. use Illuminate\Database\Eloquent\Model;
  3. class User extends Model
  4. {
  5. * 在数组中隐藏的属性。
  6. *
  7. * @var array
  8. */
  9. protected $hidden = ['password'];
  10. }

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

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

  1. <?php
  2. namespace App;
  3. use Illuminate\Database\Eloquent\Model;
  4. class User extends Model
  5. {
  6. /**
  7. *
  8. * @return bool
  9. */
  10. public function getIsAdminAttribute()
  11. {
  12. }
  13. }

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

  1. <?php
  2. namespace App;
  3. use Illuminate\Database\Eloquent\Model;
  4. class User extends Model
  5. {
  6. /**
  7. * 访问器被附加到模型数组的形式。
  8. *
  9. * @var array
  10. */
  11. }

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


{note} 欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。

转载请注明:本文档由 Laravel China 社区 [laravel-china.org] 组织翻译。