+1

7 điều bạn cần biết để tận dụng tối đa Laravel Model

  • Khi tôi bắt đầu sử dụng Laravel, tôi thấy có rất nhiều điều có thể làm tốt hơn khi sử dụng Laravel models. Sau 1 thời gian mày mò sâu hơn về Eloquent Model, tôi phát hiện một số tính năng khá hay mà bạn có thể làm với model. Nó giúp code ngắn hơn, tiện lợi hơn so với các cách làm thông thường.
  • Trong bài viết này, tôi sẽ chỉ ra 3 tips mà mọi người sử dụng Laravel nên biết để có thể tận dụng tối đa các model.

1. Đầu tiên, hãy tạo 1 model bằng dòng lệnh artisan

  • Khi tạo 1 model thông qua lệnh artisan, bạn có thể chỉ định đường dẫn mà model sẽ được tạo ở đó. Tất cả những gì cần làm là thêm đường dẫn thư mục trước tên model. Điều này hữu ích khi bạn muốn tạo model ở thư mục khác thay vì ở thư mục app như mặc định.
php artisan make:model Models/Product
  • Câu lệnh trên sẽ tạo 1 model tên Product trong thư mục app/Models.

2. Casting attributes

  • Thuộc tính $casts cung cấp một phương thức convert attributes thành các kiểu dữ liệu khác nhau khá tiện lợi.
  • Thuộc tính $casts là một mảng có key là tên của attribute được cast, còn giá trị là kiểu dữ liệu bạn muốn cast. Các kiểu dữ liệu để cast được hỗ trợ bao gồm: integer, real, float, double, string, boolean, object, array, collection, date, datetime, timestamp. Ví dụ, hãy cast attribute is_admin, được lưu trong database là integer (0 hoặc 1) thành boolean:
protected $casts = [
    'is_published' => 'boolean'
];
  • Tôi thấy nhiều bạn thường format các thuộc tính date, datetime ở Blade Template, ví dụ như này:
{{ $blog->created_at->format('Y-m-d') }}
  • Trong 1 Blade template, sẽ có những lúc bạn cần nhiều lần dùng đến giá trị này để hiển thị ra, khi đó nếu dùng cách trên, bạn sẽ phải format lại nhiều lần trên cùng 1 biến. Điều này có thể được làm hiệu quả hơn thông qua thuộc tính $casts
protected $casts = [
    'published_at' => 'datetime:Y-m-d',
];
  • Sử dụng câu lệnh trên trong model, khi gọi đến thuộc tính published_at ở Blade, nó sẽ luôn luôn trả về giá trị đã format, bạn sẽ không cần phải format ở ngoài Blade nữa.

3. Visibility

  • Một vài thuộc tính không nên có trong mảng hoặc JSON trả về của model, ví dụ như password. Đó là khi thuộc tính $hidden cần được sử dụng.
protected $hidden = [
    'password'
];
  • Bạn có thể hiểu thuộc tính $hidden như là 1 danh sách đen, những gì không thể nhìn thấy từ bên ngoài. Còn $visible thì ngược lại, nó giống như 1 danh sách trắng các thuộc tính mà có thể truy cập từ bên ngoài.
protected $visible = [
    'first_name',
    'last_name'
];
  • Khi thuộc tính $visible được set trên model, các thuộc tính còn lại sẽ tự động bị ẩn.

4. Accessors

  • Đôi khi, bạn muốn kết hợp nhiều thuộc tính thành 1 hoặc bạn muốn format lại nó. Điều này có thể thực hiện với accessors trong Laravel.
  • Giả sử bạn có 1 model User mà có 2 thuộc tính first_namelast_name. Và bạn muốn hiển thị họ và tên của user ở template, bạn thường làm như sau:
$this->first_name . ' ' . $this->last_name
  • Việc bạn làm như trên sẽ khiến bạn phải dùng đoạn lệnh trên nhiều lần nếu bạn cần hiển thị họ và tên ở nhiều nơi trên template.
  • Một accessor là một phương thức được định nghĩa trong một model với cú pháp sau:
get[NameOfAttribute]Attribute
  • Khai báo accessor để lấy cả họ và tên sẽ như sau:
public function getFullNameAttribute() {
    return "{$this->first_name} {$this->last_name}";
}
  • Sau khi định nghĩa như trên, full_name có thể được sử dụng như 1 thuộc tính của model. Bạn có thể gọi đến nó như các thuộc tính thông thường khác:
$user->full_name

5. Mutators

  • Mutators thì hơi ngược với Accessors 1 xíu. Nếu Accessors lấy giá trị từ mảng attributes và thay đổi giá trị đó để lấy ra thì Mutators lại nhận giá trị mà bạn gán vào thuộc tính rồi sau đó mới lưu vào mảng attributes.
  • Mutators có cú pháp giống với Accessors
public function setLastNameAttribute($value) {
    $this->attributes['last_name'] = ucfirst($value);
}
  • Ví dụ:
$user->last_name = 'jones'; // Will result in `Jones`

6. Appending values

  • Khi model có accessorsrelations, chúng sẽ mặc định không có trong mảng và JSON thể hiện của model. Để thêm chúng vào, bạn sử dụng thuộc tính $appends của models.
$appends = [
    'full_name'
];
  • Hãy lấy 1 ví dụ cụ thể nhé:
    • Model User có quan hệ một nhiều với Model Blog:
public function blogs() {
    return $this->hasMany(App\Blog::class);
}
  • Để thêm blogs vào model User, bạn thêm chúng vào thuộc tính $appends:
$appends = [
    'full_name',
    'blogs'
];
  • bạn cũng có thể chỉ định 1 số thuộc tính được thêm. Ví dụ, bạn chỉ muốn id và title của blog được thêm vào model User:
$appends = [
    'full_name',
    'blogs:id,title'
];

7. Touches

  • Khi 1 model có quan hệ BelongsTo hoặc BelongsToMany với 1 model khác, ví dụ 1 Comment thuộc 1 Blog. Trong 1 số trường hợp, Touches sẽ hữu ích để update timestamp của model cha khi model con được update.
class Comment extends Model
{
    protected $touches = ['blog'];

    public function blog()
    {
        return $this->belongsTo(App\Blog::class);
    }
}
  • khi model Comment được cập nhật, hệ thống sẽ tự động update thuộc tính update_at của Blog.

Kết luận

  • Trên đây là bảy tính năng mà tôi muốn chia sẻ với bạn để có thể tận dụng tối đa được Laravel Model.
  • Nếu có thắc mắc hay ý kiến gì, các bạn vui lòng để lại bình luận dưới bài viết để mình có thể giải đáp hoặc khắc phục và chỉnh sửa.
  • Thank for reading !!!

Tài liệu tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí