仅检索 Laravel 中每个团队内用户的指定角色

问题描述 投票:0回答:1

我正在实现一个

roles
permissions
系统,其中包括特定于团队的角色特定于用户的角色。我需要列出
user
所属的所有 teams,以及分配给每个
team
内的 userroles。数据结构包括:

model_has_roles

model_has_roles table


screenshot


roles
roles table

例如,如果具有 ID 1user 只能在特定团队中具有 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 与指定团队的该用户相关联。

laravel eloquent pivot many-to-many relationship
1个回答
0
投票

您可以修改函数以仅过滤当前用户的角色:

public function teamsWithRoles(): Collection
{
    $this->loadMissing(['teams.userRoles' => function ($relation) {
        $relation->where([
            'model_id' => $this->id,
            'model_type' => static::class,
        ]);
    ]);

    return $this->teams;
}

这也应该消除对查询应用不同的需要

© www.soinside.com 2019 - 2024. All rights reserved.