Laravel中如何查询排除指定角色ID的所有用户?
Laravel 排除指定角色用户的查询实现
以下是几种符合需求的查询方案,优先推荐Eloquent关联查询,同时提供查询构建器和原生SQL实现:
方法一:Eloquent关联查询(推荐)
利用Eloquent的whereDoesntHave方法,直接针对用户的roles关联筛选,排除拥有指定角色的用户:
// 排除角色ID为1的所有用户(包含无任何角色的用户) $users = User::whereDoesntHave('roles', function ($query) { $query->where('role_id', 1); })->get();
如果需要仅保留拥有角色但不含指定角色的用户,可额外添加whereHas约束:
$users = User::whereHas('roles') ->whereDoesntHave('roles', function ($query) { $query->where('role_id', 1); }) ->get();
方法二:查询构建器实现
通过子查询获取所有关联了指定角色的用户ID,再从users表中排除这些ID:
$users = DB::table('users') ->whereNotIn('id', function ($subQuery) { $subQuery->select('user_id') ->from('users_roles') ->where('role_id', 1); }) ->get();
方法三:原生SQL查询
若需要更直接的底层实现,可使用原生SQL语句:
$users = DB::select(" SELECT * FROM users WHERE id NOT IN ( SELECT user_id FROM users_roles WHERE role_id = 1 ) ");
扩展:排除多个指定角色
如果需要排除多个角色(比如ID为1和2),只需修改查询条件即可:
- Eloquent方式:
$users = User::whereDoesntHave('roles', function ($query) { $query->whereIn('role_id', [1, 2]); })->get();
- 查询构建器/原生SQL同理,将
where('role_id', 1)替换为whereIn('role_id', [1, 2])即可。
内容的提问来源于stack exchange,提问作者Hilal Najem
相关产品推荐
相关产品推荐

