Hướng dẫn

Sử dụng scope để lọc kết quả truy vấn trong Eloquent

25 / 08 / 2016

Thông thường khi truy vấn kết quả trong Laravel Eloquent thì chúng ta sẽ sử dụng câu chọn lọc là where(), tuy nhiên nếu lần nào cũng gọi nguyên như vậy lặp đi lặp thì thì code sẽ trở nên phức tạp hơn. Thay vì thế, chúng ta có thể rút gọn bằng cách sử dụng scope để tạo truy vấn chọn lọc một cách dễ dàng.

Giả sử có model là Article, nếu như muốn lấy ra tất cả các bài Article đã được published thì có thể truy vấn như này:

Article::where('is_published', true)

Bây giờ cùng tạo một scope là published, để rút gọn mệnh đề truy vấn ở trên,

public class Article extends Model
{

    public function scopePublished($query)
    {
        return $query->where('is_publised', true);
    }

}

Bây giờ để sử dụng mỗi khi cần thì chúng ta chỉ cần gọi tới hàm published() là được.

Article::published()

Chú ý: một chút là trong khai báo scope tham số truyền vào là kiểu Illuminate\Database\Eloquent\Builder, vì thế dòng return cũng trả về là một Builder. Mà vì là Builder nên để chốt hết các mệnh đề truy vấn thì chúng ta phải gọi các hàm để lấy về kết quả như get(), first(), last() ... Thêm nữa, có thể móc nối liên tiếp các scope vào nhau, ví dụ:

Article::published()->latest()->popular()->take(3)->get()

Để biết thêm chi tiết, hãy tham khảo mục Scope trong tài liệu Laravel, tiếng Anh - tiếng Việt.


Quay lại danh sách
CHIA SẺ BÀI VIẾT
KodeMate
Chat với chúng tôi Chat với chúng tôi - kodemate.com