Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 38: Eloquent ORM Serialize trong Laravel 8

Tiếp tục với series về Eloquent ORM trong Laravel, bài này mình sẽ giới thiệu với mọi người về Serialize trong Eloquent.

1. Giới thiệu.

Khi các bạn sử dụng Laravel Eloquent để xây dựng API cho ứng dụng, thì đôi lúc các bạn sẽ cần convert model data thành array hoặc JSON để trả về. Và Eloquent cũng đã cung cấp các phương thức để xử lí vấn đề này.

Hoặc bạn có thể tham khảo API resource trong eloquent model.

2. Serialize to array.

Để convert model data và các relationship của model đó (đã được load) sang aray các bạn chỉ cần sử dụng phương thức toArray. Phương thức này sẽ dùng đệ quy để convert tất cả dữ liệu về dạng array.

VD:

use App\Models\User;

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

return $user->toArray();

Hoặc bạn cũng có thể sử dụng phương thức attributesToArray để chuyển đổi tất cả các attribute của model đó về dạng array.

VD:

$user = User::first();

return $user->attributesToArray();

Hoặc bạn cũng có thể chuyển một collection model về dạng array bằng cách sử dụng phương thức toArray trong collection.

VD:

$users = User::all();

return $users->toArray();

3. Serialize to array.

Để convert model data thành JSON, các bạn có thể sử dụng phương thức toJson. Cũng giống như phương thức toArray, phương thức toJson cũng sử dụng đệ quy để convert tất cả các attribute và relation đã được load trong model thành JSON.

VD:

use App\Models\User;

$user = User::find(1);

return $user->toJson();

return $user->toJson();

Bạn cũng có thể truyền vào phương thức toJson kiểu JSON endcod các bạn mong muốn (xem danh sách các kiểu JSON encode PHP hỗ trợ).

VD:

use App\Models\User;

$user = User::find(1);

return $user->toJson();

return $user->toJson(JSON_PRETTY_PRINT);

Hoặc bạn cũng có thể ép model sang kiểu string. Lúc này magic method __toString sẽ gọi phương thức toJson để đưa model về dạng json.

VD:

return (string) User::find(1);

Cũng vì điều này nên các bạn có thể return luôn model data ở trong route, hoặc controller. Thì Laravel sẽ tự động convert model đó sang JSON.

VD:

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

Chú ý: Đối với relation name của model khi được convert sang JSON thì key name sẽ tự động được convert sang dạng "snake_case". Ví dụ relation name của bạn là "roleGroup" thì khi convert sang JSON nó sẽ có key là "role_group".

Nếu như bạn muốn ẩn một số attribute ra khỏi JSON response. Bạn có thể config ở trong thuộc tính $hidden  của model.

VD: Ẩn trường password khi convert JSON.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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

Hoặc bạn cũng có thể config các trường sẽ được hiển thị khi convert sang JSON bằng cách thiết lập chúng trong thuộc tính $visible của model.

VD:

<?php

namespace App\Models;

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

Nếu như bạn không muốn thiết lập kiểu mặc định như trên, bạn có thể sử dụng phương thức makeVisible để hiển thị các trường đang được hidden của object hiện tại.

VD:

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

Và ngược lại, bạn cũng có thể ẩn các trường đang được visible trong model object hiện tại bằng cách sử dụng phương thức makeHidden.

VD:

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

Nếu như bạn muốn đưa thêm một số attribute khác vào trong JSON data, bạn có thể định nghĩa ra một accessor và config attribute đó trong thuộc tính $append.

VD: đưa thêm trường "is_admin" vào trong JSON data.

<?php

namespace App\Models;

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

    /**
     * Determine if the user is an administrator.
     *
     * @return bool
     */
    public function getIsAdminAttribute()
    {
        return $this->attributes['admin'] === 'yes';
    }
}

Tương tự như visiblehidden, bạn cũng có thể append thêm data cho từng model object cụ thể bằng cách sử dụng phương thức append.

VD:

return $user->append('is_admin')->toArray();

Hoặc bạn có thể sử dụng phương thức setAppends để thiết lập lại các giá trị đang được định nghĩa trong thuộc tính append của model.

VD:

return $user->setAppends(['is_admin'])->toArray();

4. Serialize date.

Mặc định các attribute có kiểu dữ liệu là date hoặc datetime trong model khi convert sang JSON sẽ được chuyển về dạng ISO 8601, nhưng nếu bạn không muốn điều đó. Bạn có thể định nghĩa format mà bạn muốn trong phương thức serializeDate của model.

VD:

/**
 * Prepare a date for array / JSON serialization.
 *
 * @param  \DateTimeInterface  $date
 * @return string
 */
protected function serializeDate(DateTimeInterface $date)
{
    return $date->format('Y-m-d');
}

Hoặc bạn cũng có thể định nghĩa trong thuộc tinh $casts.

VD:

protected $casts = [
    'birthday' => 'date:Y-m-d',
    'joined_at' => 'datetime:Y-m-d H:00',
];

5. Lời kết.

Nếu như các bạn cần sử lí các logic đặc biệt, phức tạo khi response JSON data của model, các bạn có thể tham khảo API resource trong Eloquent ORM.

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha