Tag: relation

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

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

    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.