Vài điều cần biết về Laravel Model

by son
512 views

Mọi người làm Laravel cũng khá nhiều nhưng đã bao giờ đi sâu về tìm hiểu Laravel Model chưa hay dùng như thế nào cho hiệu quả.

Laravel Model hay chính xác hơn Eloquent Model là một class ActiveRecord để chúng ta làm việc dễ dàng hơn với database, sau đây thì có vài cái hay ho về Laravel Model.

Tạo model

php artisan make:model Flight

Ở guide của Laravel thì sẽ hướng dẫn như trên, và class Flight sẽ được tạo ở namespace App hay app folder.

php artisan make:model Models/Flight

Một cách tương tự thì chúng ta hay dùng App\Models vậy sao không tạo class luôn trong đó?

Casting attributes

Cái này thì không có trong Eloquent doc

$casts attribute là attribute của Eloquent, nó sử dụng để cast một field trong object về một kiểu dữ liệu nào đó

protected $casts = [
    'is_published' => 'boolean'
];

Bây giờ is_publish field sẽ luôn được trả về boolean, ngay cả khi chúng ta lưu trữ là 0 hay 1 trong database. Ngoài boolean` ra thì có thể cast nhiều cái khác ngay cảdatedatetime“`.

Một lỗi khá phổ biến là lỗi format thời gian, chúng ta trả ra nhiều kiểu format khác nhau: dd-MM-YYYY, YYYY-MM-dd.

Bây giờ có thể thống nhất như này:

protected $casts = [
    'published_at' => 'datetime:Y-m-d',
];

Như vậy chúng ta không cần format date ở đâu nữa, kể cả các template framework dùng với Laravel.

Visibility

Một số thuộc tính không nên được trả về JSON response client, ví dụ như password. Chúng ta có thể ẩn nó đi, hay exclude khỏi response của model, như kiểu một blacklist vậy dùng $hidden.

protected $hidden = [
    'password'
];

Ngược lại thì chúng ta lại có whitelist – $visible:

protected $visible = [
    'first_name',
    'last_name'
];

Khi đó ngoài những field có trong $visible ra thì toàn bộ những field còn lại sẽ bị ẩn, tương tự như: $fillable$guarded.

Accessors

Accessors đúng như cái tên, thì giúp gộp nhiều attribute thành một để chúng ta access. Ví dụ: Bình thường khi cần full name chúng ta làm như này:

$full_name = $this->first_name . ' ' . $this->last_name;

Với Accessors thì mọi chuyện đơn giản hơn, cú pháp nhắn tin như này:

get[NameOfAttribute]Attribute

đây là ví dụ:

public function getFullNameAttribute() {
    return "{$this->first_name} {$this->last_name}";
}

Xong rồi gọi như này:

$full_name = $user->full_name;

Mutators

Tương tự như Accessors, thì Mutators dùng cho việc update giá trị, cú pháp cũng tương tự như Accessors luôn:

public function setLastNameAttribute($value) {
    $this->attributes['last_name'] = ucfirst($value);
}

thì ví dụ

$user->last_name = 'hoang';
$last_name = $user->last_name; //cái này sẽ trả ra Hoang
//vì ucfirst sẽ capitalized cái chữ cái đầu

Appending values

Mặc định, Accessors với cả relations thì sẽ không được thêm vào array hay JSON của Model, vậy nếu cần thì chúng ta dùng $appends ví dụ với cái getFullNameAttribute như trên:

$appends = [
    'full_name'
];

Có cái này hơi ngu chút: $appends thì vẫn sử dụng snake case còn Accessors thì sử dụng camel case.

Vụ appending với cả relations thì mọi người tự tìm hiểu nhé.

Touches

Khi model có relations BelongsTo hoặc BelongsToMany với model khác, trong trường hợp này, một Comment thuộc về Blog, trong một số trường hợp, chúng ta cần update timestamp của Blog khi edit hoặc thêm mới Comment. $touches có thể làm điều này.

class Comment extends Model
{
    protected $touches = ['blog'];

    public function blog()
    {
        return $this->belongsTo(App\Blog::class);
    }
}

Trên đây là mấy cái mình vừa tìm hiểu được :D, có điều vẫn còn nhiều cái nữa, mong sẽ được chia sẽ trong những phần sau.

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

You may also like