Fetch results dựa trên sự tồn tại của một relationship trong Laravel Eloquoent Chuyên mục PHP và Laravel 2023-07-27 200 Lượt xem 102 Lượt thích 0 Bình luận

Nếu bạn muốn kiểm tra xem model eloquoent có mối quan hệ nhất định hay không và lấy kết quả tương ứng trong khi truy vấn của nó, bạn có thể thực hiện việc này bằng hai cách tiếp cận trong Laravel Eloquent.
- Bằng cách sử dụng phương thức has để kiểm tra sự tồn tại của một relationship
- Bằng cách sử dụng phương thức doesntHave để kiểm tra sự tồn tại của một relationship
Chúng ta sẽ lần lượt xem xét cả hai cách tiếp cận trên. let goo !
Kiểm tra sự tồn tại của một relationship
Giả sử bạn chỉ muốn lấy những người dùng đã đăng ít nhất một bức ảnh. Bạn có thể thực hiện việc này bằng cách pass tên của relationship cho phương thức has trên User model.
// Retrieve all users that have at least one photo uploaded...
$users = App\User::has('photos')->get();
Bạn có thể lọc thêm kết quả bằng cách cung cấp một operator( toán tử ) và count vào phương thức has. Chẳng hạn, trong ví dụ trên, nếu bạn chỉ muốn truy xuất những người dùng đã tải lên 5 ảnh trở lên, bạn có thể thực hiện như sau.
$users = App\User::has('photos', '>=', 5)->get();
Bạn cũng có thể gắn thêm các mối quan hệ bằng cách sử dụng ký hiệu "dấu chấm (.)" để kiểm tra sự tồn tại của các mối quan hệ lồng nhau. Chẳng hạn, nếu bạn muốn truy xuất người dùng có ảnh kèm theo comments trên đó, bạn có thể thực hiện như thế này.
// Retrieve all users that have at least one photo with comments on it...
$users = App\User::has('photos.comments')->get();
Nếu bạn cũng muốn thêm các điều kiện vào chính mối quan hệ đó, bạn có thể thực hiện việc này bằng các phương thức whereHas hoặc orWhereHas mà bạn có thể pass điều kiện đó bằng cách sử dụng một Closure cho tham số thứ hai của phương thức whereHas hoặc orWhereHas.
Chẳng hạn, nếu bạn muốn lấy tất cả người dùng đến từ tiểu bang “Arizona”, bạn có thể thực hiện việc này như thế này.
use Illuminate\Database\Eloquent\Builder;
// Retrieve users with at least one address containing state like arizona%...
$users = App\User::whereHas('addresses', function (Builder $query) {
$query->where('state', 'like', 'arizona%');
})->get();
Kiểm tra sự tồn tại của các relationships
Tương tự như việc kiểm tra sự tồn tại của mối quan hệ trên một model nhất định, bạn có thể kiểm tra sự tồn tại của một số mối quan hệ nhất định và lấy kết quả tương ứng. Với mục đích này, Eloquoent cung cấp các phương thức doesntHave và orDoesntHave .
Chẳng hạn như trong ví dụ trước nếu bạn chỉ muốn lấy những người dùng không có một ảnh nào. Bạn có thể làm điều này bằng cách pass tên của relationship tới phương thức không có trên User model.
// Retrieve all users that don't have a photo...
$users = App\User::doesntHave('photos')->get();
Nếu bạn muốn lọc truy vấn bằng cách áp dụng các điều kiện cho relationship, bạn có thể sử dụng thêm các phương thức whereDoesntHave và orWhereDoesntHave để đặt điều kiện “where” vào truy vấn doesntHave của bạn.
Chẳng hạn, nếu bạn muốn lấy tất cả người dùng không đến từ bang “Arizona”, bạn có thể thực hiện như thế này
use Illuminate\Database\Eloquent\Builder;
// Retrieve users with at least one address containing state like arizona%...
$users = App\User::whereDoesntHave('addresses', function (Builder $query) {
$query->where('state', 'like', 'arizona%');
})->get();
Bạn cũng có thể sử dụng khái niệm "dấu chấm (.)" để tạo mối quan hệ lồng nhau và thực hiện truy vấn đối với nó. Ví dụ: Nếu bạn muốn truy xuất những người dùng có ảnh có tác giả nhận xét đang active. Bạn có thể làm điều này như sau:
use Illuminate\Database\Eloquent\Builder;
$users = App\User::whereDoesntHave('photos.comments.author', function (Builder $query) {
$query->where('active', 0);
})->get();

Bình luận (0)