Oczekując, że relacje są ustawione prawidłowo, można to dość łatwo osiągnąć za pomocą whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Odnośnie komentarza:jeśli chcesz pobrać wszystkich użytkowników, którzy mają co najmniej jedną rolę, ale ich role mogą nie zawierać roli administratora, możesz użyć tego zapytania:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
zapewni, że EXISTS
jedna rola dla użytkownika, podczas gdy whereDoesntHave('roles', fn())
zapewni, że nie jest to rola administratora.
Uwaga na temat sugerowanej edycji @Jino Antony:
Kiedy mamy do czynienia z relacjami wiele-do-wielu, wszystkie whereX($col, $val)
metody konstruktora zapytań działają na innej tabeli (roles
w tym przypadku), a nie tabela przestawna (role_user
). Aby wykonać zapytanie o kolumnę w tabeli przestawnej, musisz użyć wherePivot('role_id', $roleToExclude)
w moim przykładzie.