我正在实现一个
roles
和permissions
系统,其中包括特定于团队的角色和特定于用户的角色。我需要列出 user所属的所有
teams
,以及分配给每个 team内的 user 的
roles
。数据结构包括:
表
model_has_roles
:
表
roles
:
例如,如果具有 ID 1 的 user 只能在特定团队中具有 ID 4 和 5 的角色,我想确保只有这些角色出现在结果中。
此外,如果该用户属于多个团队,则每个团队中分配给该用户的任何角色都应包含在结果中。
代码结构
我尝试建立以下关系:
团队型号:
public function userRoles(): BelongsToMany
{
return $this->belongsToMany(Role::class, 'model_has_roles', 'team_id', 'role_id')->distinct();
}
用户型号:
public function teams(): BelongsToMany
{
return $this->belongsToMany(Team::class, 'model_has_roles', 'model_id', 'team_id')->distinct();
}
public function teamsWithRoles(): Collection
{
$this->loadMissing(['teams', 'teams.userRoles']);
return $this->teams;
}
当前检查 运行以下检查:
$user->teamsWithRoles()->pluck('userRoles', 'id')->map(fn($collection) => $collection->pluck('name', 'id'))->dd()
生产:
{"1":{"4":"user","8":"user"},"2":{"5":"system"}}
这里,结果包括一个意想不到的角色(ID 8)。我只希望角色 ID 4 和 5 与指定团队的该用户相关联。
您可以修改函数以仅过滤当前用户的角色:
public function teamsWithRoles(): Collection
{
$this->loadMissing(['teams.userRoles' => function ($relation) {
$relation->where([
'model_id' => $this->id,
'model_type' => static::class,
]);
]);
return $this->teams;
}
这也应该消除对查询应用不同的需要