Mysql
 sql >> Database >  >> RDS >> Mysql

Ottenere tutti gli utenti tranne gli amministratori in una relazione molti-a-molti

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.