Mong rằng các mối quan hệ được thiết lập đúng cách, điều này có thể đạt được khá dễ dàng với whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Về nhận xét:nếu bạn muốn truy xuất tất cả người dùng có ít nhất một vai trò, nhưng vai trò của họ có thể không chứa vai trò quản trị viên, thì bạn có thể sử dụng truy vấn sau:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
sẽ đảm bảo có EXISTS
một vai trò cho người dùng, trong khi whereDoesntHave('roles', fn())
sẽ đảm bảo đó không phải là vai trò quản trị viên.
Lưu ý về chỉnh sửa được đề xuất của @Jino Antony:
Khi xử lý quan hệ nhiều-nhiều, tất cả whereX($col, $val)
các phương thức của trình tạo truy vấn hoạt động trên bảng khác (roles
trong trường hợp này), không phải là bảng tổng hợp (role_user
). Để truy vấn một cột trên bảng tổng hợp, bạn cần sử dụng wherePivot('role_id', $roleToExclude)
trong ví dụ của tôi.