7 điều bạn cần biết để tận dụng tối đa Laravel Model
Bài đăng này đã không được cập nhật trong 5 năm
- 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
appnhư 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
$castscung 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
$castslà 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ànhboolean:
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$hiddencần được sử dụng.
protected $hidden = [
'password'
];
- Bạn có thể hiểu thuộc tính
$hiddennhư là 1 danh sách đen, những gì không thể nhìn thấy từ bên ngoài. Còn$visiblethì 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
Usermà có 2 thuộc tínhfirst_namevàlast_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
accessorlà 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_namecó 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
Mutatorsthì hơi ngược vớiAccessors1 xíu. NếuAccessorslấy giá trị từ mảng attributes và thay đổi giá trị đó để lấy ra thìMutatorslạ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.Mutatorscó cú pháp giống vớiAccessors
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ó
accessorsvàrelations, 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$appendscủ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ệ
BelongsTohoặcBelongsToManyvới 1 model khác, ví dụ 1 Comment thuộc 1 Blog. Trong 1 số trường hợp,Touchessẽ 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_atcủ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