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.