Esperando que os relacionamentos sejam configurados corretamente, isso pode ser alcançado facilmente com
whereDoesntHave() :$roleToExclude = 1;
$users = User::query()
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
Em relação ao comentário:se você deseja recuperar todos os usuários que possuem pelo menos uma função, mas suas funções podem não conter a função de administrador, você pode usar esta consulta:
$roleToExclude = 1;
$users = User::query()
->has('roles')
->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
$query->where('id', $roleToExclude);
})
->get();
has('roles') garantirá que EXISTS uma função para o usuário, enquanto whereDoesntHave('roles', fn()) garantirá que não seja uma função de administrador. Uma nota sobre a edição sugerida de @Jino Antony:
Ao lidar com relações muitos-para-muitos, todos os
whereX($col, $val) métodos do construtor de consultas operam na outra tabela (roles neste caso), não a tabela dinâmica (role_user ). Para consultar uma coluna na tabela dinâmica, você precisa usar wherePivot('role_id', $roleToExclude) no meu exemplo.