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.