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 4 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
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à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$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ínhfirst_name
và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
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ớiAccessors
1 xíu. NếuAccessors
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ớ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ó
accessors
và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$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ặcBelongsToMany
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