答案 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