Forventer man, at relationerne er konfigureret korrekt, kan dette opnås ret nemt med whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Angående kommentaren:hvis du ønsker at hente alle brugere, der har mindst én rolle, men deres roller måske ikke indeholder admin-rollen, så kan du bruge denne forespørgsel:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
vil sikre, at der EXISTS
én rolle for brugeren, mens whereDoesntHave('roles', fn())
vil sikre, at det ikke er en administratorrolle.
En note om den foreslåede redigering af @Jino Antony:
Når du har at gøre med mange-til-mange-relationer, er alle whereX($col, $val)
metoderne i forespørgselsbyggeren fungerer på anden tabel (roles
i dette tilfælde), ikke pivottabellen (role_user
). For at forespørge på en kolonne i pivottabellen skal du bruge wherePivot('role_id', $roleToExclude)
i mit eksempel.