Cách group các where constraints trong Laravel Eloquent Chuyên mục PHP và Laravel 2023-08-02 555 Lượt xem 40 Lượt thích 0 Bình luận

Khi viết các truy vấn MySQL, nếu có nhiều hơn hai điều kiện where, bạn sẽ muốn nhóm các constraints/conditions (ràng buộc/điều kiện) nhất định để tránh hành vi không mong muốn. Ví dụ: kiểm tra truy vấn sau.
select * from books
where author_name = 'JK Rowling'
and rating > 4
or genre = 'fiction';
Ở đây, nếu chúng ta không đề cập cụ thể cách đánh giá điều kiện and và or, chúng ta có thể nhận được kết quả không mong muốn. Vì vậy, chúng ta phải xác định rõ ràng thứ tự của chúng và đối với điều đó và trong MySQL, chúng ta có thể sử dụng dấu ngoặc đơn để đạt được điều này.
Nếu chúng ta muốn xác định xem rating > 4 or genre = 'fiction' trong truy vấn trước có nên được đánh giá trước hay không, chúng ta có thể làm điều đó bằng cách sử dụng dấu ngoặc đơn như này.
select * from books
where author_name = 'JK Rowling'
and (rating > 4 or genre = 'fiction');
Chúng ta cũng có thể làm được điều tương tự trong Eloquent. Đối với điều này, chúng ta có thể chuyển một Closure vào phương thức where của Eloquent, nơi chúng ta có thể đặt thêm các ràng buộc muốn được nhóm lại. Vì vậy, nếu chúng ta muốn viết truy vấn trước đó bằng Eloquent, chúng ta có thể làm như này.
$books = Book::where('author_name', '=', 'JK Rowling')
->where(function ($query) {
$query->where('rating', '>', 4)
->orWhere('genre', '=', 'fiction');
})
->get();
Như bạn có thể thấy ở đây, chúng ta đã pass một Closure vào where condition sẽ nhận một query builder instance $query trên đó chúng ta có thể thêm nhiều ràng buộc hơn sẽ được chứa trong nhóm dấu ngoặc đơn.

Bình luận (0)