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ả
datevà
datetime“`.
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
và $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 Reply