Laravel Eloquent – Scope
Hi các bạn
Hôm nay mình tiếp tục đi tiếp về Eloquent của Laravel nhé, kỳ này chúng ta sẽ qua Scope.
1/ Scope là gì?
Scope là một phương thức hỗ trợ ta thêm 1 điều kiện nào đó để quá trình query diễn ra gọn gàng nhanh chóng hơn. Để chúng ta đỡ phải gọi method where gây dài dòng thậm chí là rối code của chúng ta.
Cũng như hỗ trợ cho chúng ta khả năng re-usable cao.
Ví dụ:
// Query bình thường
$item = ItemModel::where('Column_Name(Hard_Code)', $value)->get();
// Query with Scope
$item = ItemMode::byOption($value)->get(); // reusable
2/ Cách khởi tạo Scope
Cũng tương tự như Relationship, ta sẽ tạo Scope thông qua 1 method public.
Chúng ta có 2 loại scope khác nhau bên trong Eloquent Model, và 2 loại này sẽ có chung tên là Local Scope. Mình sẽ ko hướng dẫn Global Scope nhé 😀
Tất cả func scope đều phải đặt tên với mẫu như sau: scope{Name} và param đầu tiên sẽ luôn là Model để ta query. {Name} phải viết dưới dạng chữ đầu từ là in hoa.
Local Hard Scope
Là scope sẽ ko có nhận giá trị gì để query cả, ta sẽ query theo giá trị mà ta set cứng (hard-code).
class UserModel extends Model {
...
// Define in your Model
public function scopeUserActive($query)
{
return $query->where("Status", "active");
}
...
}
Scope này sẽ hỗ trợ mình filter ra User mà có Status = active
Local Dynamic Scope
Với Scope Dynamic, ta sẽ truyền được giá trị vào, ở đây mình sẽ truyền vào email cần filter.
class UserModel extends Model {
...
// Define in your Model
public function scopeFindEmail($query, $email)
{
return $query->where("Email", $email);
}
...
}
3/ Cách sử dụng Scope
Mình sẽ gọi scope như sau để query:
// normal
$all_users_active = UserModel::userActive()->get();
// dynamically
$email_filter_user = UserModel::findEmail($email)->get();
Tức là bỏ scope đằng trước và tên đằng sau sẽ ghi dưới dạng CAMEL CASE. Đơn giản phải không nhỉ 😀
Ngoài ra ta cũng có thể thực thi Hard Scope ở một Relationship Method như sau:
// Scope from Relation Model
public function scopeOrderActive($query)
{
return $query->where("Status", "active");
}
// Relationship from UserModel
public function UserActivedOrder()
{
return $this->hasMany("OrderModel", "OrderID")->orderActive();
}
Lưu ý: Với Dynamic Scope, chúng ta sẽ không query được với Relationship Model, trừ khi ta lấy Data từ nơi khác bỏ vào (ko phải Data trong Model Eloquent $this->columnName….)
4/ Kết Luận về Laravel Eloquent – Scope
Với Laravel Eloquent – Scope, ta đã đi thêm 1 bước nữa với Eloquent của Laravel.
Congrats, các bạn đã gần master được Eloquent rồi đó 😀
Please enjoy and have fun!
== Các bài cũ về Eloquent:
Eloquent Relationship: http://sethphat.com/sp-489/laravel-5-eloquent-relationship-can-ban