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.