Очаквайки, че връзките са настроени правилно, това може да се постигне доста лесно с whereDoesntHave()
:
$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Относно коментара:ако искате да извлечете всички потребители, които имат поне една роля, но ролите им може да не съдържат ролята на администратор, тогава можете да използвате тази заявка:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles')
ще гарантира, че EXISTS
една роля за потребителя, докато whereDoesntHave('roles', fn())
ще гарантира, че не е администраторска роля.
Бележка за предложената редакция на @Jino Antony:
Когато работите с релации много към много, всички whereX($col, $val)
методите на конструктора на заявки работят върху другата таблица (roles
в този случай), а не основната таблица (role_user
). За да направите заявка за колона в обобщената таблица, ще трябва да използвате wherePivot('role_id', $roleToExclude)
в моя пример.