You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:12:39