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.