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.