gpt4 book ai didi

laravel - Eloquent 多对多选择没有特定角色的用户

转载 作者:行者123 更新时间:2023-12-04 21:09:39 25 4
gpt4 key购买 nike

所以我有User & Role具有多对多关系的模型,我有 3 个角色:super , adminmoderator有 4 个用户让我们说:John , Mike , JamesLarry .
Johnsuper , Mikeadminmoderator角色,JamesadminLarrymoderator .为了显示没有特定角色的用户,我创建了这个范围:

public function scopeDoesntHaveRoles($query, $roles = [], $column = 'id') {
return $query->whereDoesntHave('roles')->orWhereHas('roles', function ($q) use ($roles, $column) {
$q->whereNotIn($column, $roles);
});
}

当我调用 User::doesntHaveRoles([1])->lists('name', 'id')获取没有 super 的用户作用,它起作用并返回:
{"2":"Mike","3":"James","4":"Larry"}

但是,当我试图列出没有 admin 的用户时角色 User::doesntHaveRoles([2])->lists('name', 'id') , 是的 James此处未显示,但 Mike出现时他实际上有 admin角色:
{"1":"John","2":"Mike","4":"Larry"}

我想是因为 Mike也有 moderator角色,你发现我的范围有什么问题吗?还是您有其他解决方案?

谢谢

编辑:
这是我的数据透视图
Schema::create('user_roles', function (Blueprint $table) {
$table->integer('user_id')->unsigned();
$table->integer('role_id')->unsigned();

$table->primary([
'user_id', 'role_id'
]);
});
User模型
public function roles()
{
return $this->belongsToMany(Role::class, 'user_roles');
}
Role模型
public function users()
{
return $this->belongsToMany(User::class, 'user_roles');
}

最佳答案

我会使用 whereNotIn而不是 whereDoesntHave .

给定一个 Role存储在变量 $role 中您可以通过以下方式获取所有没有该角色的用户:

/* @var Role $role */
User::whereNotIn(function('id', $query) use ($role) {
$query->select('user_id')
->from('user_roles')
->where('role_id', $role->id);
});

内部查询将返回具有给定角色的用户的所有 ID。使用 whereNotIn将返回相反的一组用户。将创建以下查询:

select *
from users
where user_id not in (
select user_id
from user_roles
where role_id = ?
);

现在有一个 Collection存储在 $roles 中的角色您可以通过以下方式获取所有不具有任何该角色的用户:

/* @var Collection|Role[] $roles */
User::whereNotIn(function('id', $query) use ($roles) {
$query->select('user_id')
->from('user_roles')
->whereIn('role_id', $roles->pluck('id');
});

内部选择将返回在集合中具有角色之一的所有用户的 ID。与 whereNotIn你会再次得到相反的结果。您也可以使用角色 ID 数组代替 $roles->pluck('id') .

构建器将创建一个查询,如

select *
from users
where user_id not in (
select user_id
from user_roles
where role_id in (?, ?, ..)
);

关于laravel - Eloquent 多对多选择没有特定角色的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37347402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com