sql >> Base de Datos >  >> RDS >> Mysql

Obtener todos los usuarios excepto los administradores en una relación de muchos a muchos

Esperando que las relaciones estén configuradas correctamente, esto se puede lograr con bastante facilidad con whereDoesntHave() :

$roleToExclude = 1;
$users = User::query()
    ->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
        $query->where('id', $roleToExclude);
    })
->get();

Con respecto al comentario:si desea recuperar todos los usuarios que tienen al menos un rol, pero es posible que sus roles no contengan el rol de administrador, puede usar esta consulta:

$roleToExclude = 1;
$users = User::query()
    ->has('roles')
    ->whereDoesntHave('roles', function (Builder $query) use ($roleToExclude) {
        $query->where('id', $roleToExclude);
    })
->get();

has('roles') se asegurará de que EXISTS un rol para el usuario, mientras que whereDoesntHave('roles', fn()) se asegurará de que no sea un rol de administrador.

Una nota sobre la edición sugerida de @Jino Antony:

Cuando se trata de relaciones de muchos a muchos, todos los whereX($col, $val) los métodos del generador de consultas operan en la otra tabla (roles en este caso), no la tabla dinámica (role_user ). Para consultar una columna en la tabla dinámica, debe usar wherePivot('role_id', $roleToExclude) en mi ejemplo.