Làm thứ làm cho Laravel Request của bạn thú vị hơn

Laravel Eloquent – Scope cơ bản tới nâng cao

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

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Bình luận qua Facebook