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.