Aspettandosi che le relazioni siano impostate correttamente, questo può essere ottenuto abbastanza facilmente con whereDoesntHave() :
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Per quanto riguarda il commento:se desideri recuperare tutti gli utenti che hanno almeno un ruolo, ma i loro ruoli potrebbero non contenere il ruolo di amministratore, puoi utilizzare questa query:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles') assicurerà che EXISTS un ruolo per l'utente, mentre whereDoesntHave('roles', fn()) assicurerà che non sia un ruolo di amministratore.
Una nota sulla modifica suggerita di @Jino Antony:
Quando si tratta di relazioni molti-a-molti, tutti i whereX($col, $val) i metodi del generatore di query operano sull'altra tabella (roles in questo caso), non la tabella pivot (role_user ). Per interrogare una colonna sulla tabella pivot, devi usare wherePivot('role_id', $roleToExclude) nel mio esempio.