Quay lại

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    199 Lượt xem    101 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Fetch results dựa trên sự tồn tại của một relationship trong Laravel Eloquoent

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 whereDoesntHaveorWhereDoesntHave để đặ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)

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