Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Obtendo todos os usuários, exceto administradores, em relacionamento muitos-para-muitos


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.