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.