以多对多关系吸引除管理员以外的所有用户

时间:2019-06-28 05:45:26

标签: mysql laravel many-to-many

我有一个用户表和角色表,它们以role_user表中的多对多关系进行连接。 我想获得除具有管理员角色的用户以外的所有用户,我要包括没有任何角色的用户。 基本上,除管理员外的所有用户。 enter image description here

5 个答案:

答案 0 :(得分:2)

在用户模型中添加关系。

User.php

public function roles(){
    return $this->belongsToMany(Role::class);
}

用于检索

$user = User::whereHas('roles', function($query){
   $query->where('name', '<>', 'admin') // role with no admin
});

用于普通MYSQL

SELECT u.* FROM users u 
    INNER JOIN role_user ru ON ru.user_id = u.id
    INNER JOIN roles r ON r.id = ru.role_id WHERE r.name <> 'admin';

答案 1 :(得分:1)

由于期望正确建立关系,因此可以很容易地通过whereDoesntHave()实现:

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

关于注释:如果要检索具有至少一个角色但所有角色可能不包含admin角色的所有用户,则可以使用以下查询:

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

has('roles')将确保为用户提供EXISTS一个角色,而whereDoesntHave('roles', fn())将确保它不是管理员角色。


关于@Jino Antony建议编辑的注释:

在处理多对多关系时,查询构建器的所有whereX($col, $val)方法都在 other表(在这种情况下为roles)上运行,而不是在数据透视表role_user)。要查询数据透视表上的列,您需要在我的示例中使用wherePivot('role_id', $roleToExclude)

答案 2 :(得分:0)

您能试试这个吗?如果您不使用模型关系,则可以使用

$users = DB::table(role_user as ru')
                ->join('users as u', 'ru.user_id', '=', 'u.id')
                ->join('roles as r', 'r.id', '=', 'ru.id')
                ->where('r.name', '<>', 'admin')->get()

答案 3 :(得分:0)

尝试以下代码:

$users = User::whereDoesntHave('roles', function ($query) {
    $query->where('name', Role::ROLE_ADMIN);
})->get();

在User.php文件中添加关系代码。

public function roles()
{
    return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');
}

答案 4 :(得分:0)

由于上述答案缺失,我添加了该关系的反向方法

b2