Eloquent: Serialization

Introduction

Khi xây dựng JSON API, bạn sẽ cần phải convert model và relationship thành mảng hay JSON. Eloquent cung cấp sẵn các hàm tiện ích để thực hiện việc này, cũng như các thao tác xử lý attributes đi kèm trong serialization.

Serializing Models & Collections

Serializing thành Arrays

Khi convert một model và relationships của nó thành một mảng, bạn có thể sử dụng hàm toArray method. Hàm này thực hiện đệ quy, vì thế tất cả các attributes và relations (bao gồm relation của relations nữa) sẽ được convert thành mảng:

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

return $user->toArray();

You may also convert entire collections of models to arrays:

$users = App\User::all();

return $users->toArray();

Serializing thành JSON

Để convert một model thành JSON, bạn có thể sử dụng hàm toJson. Giống như toArray, hàm toJson cũng đệ quy và tất cả attributes cùng với relations sẽ được convert thành JSON:

$user = App\User::find(1);

return $user->toJson();

Ngoài ra, bạn có thể cast model hay collection thành string, việc này sẽ tự động gọi tới hàm toJson trong model hoặc collection:

$user = App\User::find(1);

return (string) $user;

Vì model và collection được convert thành JSON khi cast thành string, bạn có thể trả về đối tượng Eloquent trực tiếp từ trong route hay controller:

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

Hiding Attributes From JSON

Sẽ có lúc bạn muốn giới hạn attributes như mật khẩu không được hiển thị trong kết quả array hay JSON sau khi convert. Để làm được điều đó, thêm vào thuộc tính $hidden vào trong model:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var  array
     */
    protected $hidden = ['password'];
}

Khi giấu relationships, sử dụng tên phương thức của relationship, chứ không phải thuộc tính động của nó.

Một cách khác, bạn có thể sử dụng thuộc tính visible để định nghĩa một white-list của những thuộc tính đó được bao gồm trong mảng của model và JSON representation. Tất cả các thuộc tính khác sẽ bị hidden khi model được convert thành mảng hoặc JSON:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be visible in arrays.
     *
     * @var  array
     */
    protected $visible = ['first_name', 'last_name'];
}

Temporarily Modifying Attribute Visibility

Nếu bạn muốn làm cho một số thuộc tính đã giấu có thể thấy được, sử dụng hàm makeVisible. Hàm makeVisible Hàm này trả về một đối tượng của model làm cho việc móc nối tiện hơn:

return $user->makeVisible('attribute')->toArray();

Tương tự, nếu bạn muốn tạo một số attributes visible trong một thể hiện model, bạn có thể sự dùng hàm makeHidden.

return $user->makeHidden('attribute')->toArray();

Appending Values To JSON

Thỉnh thoảng, khi casting models thành array hoặc JSON, bạn cũng có thể thêm vào thuộc tính mà không có trường lưu trong database. Để làm thế, đầu tiện cần phải khai báo một accessor:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the administrator flag for the user.
     *
     * @return  bool
     */
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] == 'yes';
    }
}

Khi đã tạo được accessor, thêm vào tên của attribute vào thuộc tính appends trong model. Chú ý là tên của attribute là theo kiểu "snake case", mặc dù accessor được xác định bằng kiểu "camel case":

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The accessors to append to the model's array form.
     *
     * @var  array
     */
    protected $appends = ['is_admin'];
}

Khi mà attribute được thêm vào trong danh sách appends, nó sẽ được thêm vào khi convert thành thành array hay JSON. Attribute trong mảng appends cũng sẽ tuần tự theo cấu hình visiblehidden trong model.

Nguồn: https://laravel.com/docs/5.3/eloquent-serialization