Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Alle Benutzer außer Administratoren in eine Viele-zu-Viele-Beziehung bringen

Vorausgesetzt, dass die Beziehungen richtig eingerichtet sind, kann dies ziemlich einfach mit whereDoesntHave() erreicht werden :

$roleToExclude = 1;
$users = User::query()
    ->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
        $query->where('id', $roleToExclude);
    })
->get();

Bezüglich des Kommentars:Wenn Sie alle Benutzer abrufen möchten, die mindestens eine Rolle haben, aber ihre Rolle möglicherweise nicht die Admin-Rolle enthält, können Sie diese Abfrage verwenden:

$roleToExclude = 1;
$users = User::query()
    ->has('roles')
    ->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
        $query->where('id', $roleToExclude);
    })
->get();

has('roles') stellt sicher, dass EXISTS vorhanden ist eine Rolle für den Benutzer, während whereDoesntHave('roles', fn()) stellt sicher, dass es sich nicht um eine Administratorrolle handelt.

Eine Anmerkung zur vorgeschlagenen Bearbeitung von @Jino Antony:

Wenn es um viele-zu-viele-Beziehungen geht, müssen alle whereX($col, $val) Methoden des Abfragegenerators arbeiten mit der anderen Tabelle (roles in diesem Fall), nicht die Pivot-Tabelle (role_user ). Um eine Spalte in der Pivot-Tabelle abzufragen, müssen Sie wherePivot('role_id', $roleToExclude) verwenden in meinem Beispiel.