In de verwachting dat de relaties goed zijn ingesteld, kan dit vrij eenvoudig worden bereikt met whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Wat betreft de opmerking:als u alle gebruikers wilt ophalen die ten minste één rol hebben, maar hun rollen mogen niet de beheerdersrol bevatten, dan kunt u deze query gebruiken:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
zal ervoor zorgen dat er EXISTS
één rol voor de gebruiker, terwijl whereDoesntHave('roles', fn())
zal ervoor zorgen dat het geen beheerdersrol is.
Een opmerking over de voorgestelde bewerking van @Jino Antony:
Als het om veel-op-veel-relaties gaat, moeten alle whereX($col, $val)
methoden van de querybuilder werken op de andere tabel (roles
in dit geval), niet de draaitabel (role_user
). Om een kolom in de draaitabel te doorzoeken, moet u wherePivot('role_id', $roleToExclude)
gebruiken in mijn voorbeeld.