Očekáváme-li, že vztahy jsou správně nastaveny, lze toho dosáhnout poměrně snadno pomocí whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Ohledně komentáře:pokud chcete získat všechny uživatele, kteří mají alespoň jednu roli, ale jejich role nemusí obsahovat roli správce, můžete použít tento dotaz:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
zajistí, že EXISTS
jedna role pro uživatele, zatímco whereDoesntHave('roles', fn())
zajistí, že se nejedná o roli správce.
Poznámka k navrhované úpravě od @Jino Antony:
Když se zabýváte vztahy many-to-many, všechny whereX($col, $val)
metody tvůrce dotazů fungují na jiné tabulce (roles
v tomto případě), nikoli kontingenční tabulka (role_user
). Chcete-li zadat dotaz na sloupec v kontingenční tabulce, musíte použít wherePivot('role_id', $roleToExclude)
v mém příkladu.