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.