Quay lại

So sánh phương thức WhereRelation và WhereHas trong Laravel Chuyên mục PHP và Laravel    2023-11-16    16 Lượt xem    13 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

So sánh phương thức WhereRelation và WhereHas trong Laravel

Việc kiểm tra sự tồn tại của các mối quan hệ và lấy các bản ghi model khá dễ dàng trong Laravel.

Ví dụ: Giả sử bạn muốn truy xuất tất cả book có ít nhất một bài review, bạn có thể làm như sau:

use App\Models\Book;

$books = Book::has('reviews')->get();

Phương thức WhereHas

Bây giờ, nếu bạn muốn tìm hiểu sâu hơn về vấn đề này, chẳng hạn, nếu bạn chỉ muốn truy xuất những books có nhiều hơn 3 stars, bạn có thể sử dụng phương thức WhereHas như sau.

use App\Models\Book;
use Illuminate\Database\Eloquent\Builder;

$books = Book::whereHas('reviews', function (Builder $query) {
    $query->where('stars', '>', 3);
})->get();

Tất cả điều này đều tốt nhưng trong PR gần đây, một phương pháp thay thế đã được thêm vào, hoạt động tương tự nhưng mang lại experience tốt hơn cho developer.

Phương thức WhereRelation mới

Như đã đề cập trước đó, trong PR cho Laravel 8.x, đã giới thiệu một phương thức mang tên là whereRelation, đây đơn giản là phương thức whereHas nhưng mang lại khả năng đọc tốt hơn và giảm độ phức tạp của mã bằng cách loại bỏ hoàn toàn closure.

Dưới đây là cách viết lại ví dụ trước đó bằng cách sử dụng whereRelation.

use App\Models\Book;

$books = Book::whereRelation('reviews', 'stars', '>=', 3)->get();

Như bạn có thể thấy, phương pháp này làm cho truy vấn dễ đọc hơn mà không cần phải truyền một closure vào nó.

PR cũng thêm một số phương thức khác như orWhereRelation(), whereMorphRelation()orWhereMorphRelation() cho các mối quan hệ morph, hoạt động theo cách tương tự như phương thức whereRelation().

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday