Om man förväntar sig att relationerna är korrekt inställda kan detta uppnås ganska enkelt med whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Angående kommentaren:om du vill hämta alla användare som har minst en roll, men deras roller kanske inte innehåller administratörsrollen, kan du använda den här frågan:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
kommer att se till att det EXISTS
en roll för användaren, medan whereDoesntHave('roles', fn())
kommer att se till att det inte är en administratörsroll.
En anteckning om den föreslagna redigeringen av @Jino Antony:
När du har att göra med många-till-många-relationer, alla whereX($col, $val)
metoderna för frågebyggaren fungerar på den andra tabellen (roles
i det här fallet), inte pivottabellen (role_user
). För att fråga en kolumn i pivottabellen måste du använda wherePivot('role_id', $roleToExclude)
i mitt exempel.