Laratrust 显示团队内部的用户角色

问题描述

我正在尝试在团队和用户之间建立联系。 几乎 Latrust 看起来是一个很棒的包我认为有些事情可以更好地解释。

让我们选择一个团队(比如:team_id = 1): $team = Team::where('id',$request->team_id)->first();

让我们从团队中挑选我们的用户

$roles = Role::get();
$users = User::whereRoleIs($roles->pluck('name')->toArray(),$team)->get()

结果如下:

{
    "message": "ok","data": [
        {
            "id": 1,"name": "niki","email": "niki@user.com","email_verified_at": null,"created_at": "2021-07-12T11:29:09.000000Z","updated_at": "2021-07-12T11:29:09.000000Z","roles": [
                {
                    "id": 3,"name": "user","display_name": "User","description": "User","created_at": "2021-07-12T11:29:08.000000Z","updated_at": "2021-07-12T11:29:08.000000Z","pivot": {
                        "user_id": 1,"role_id": 3,"user_type": "App\\Models\\User"
                    }
                },{
                    "id": 4,"name": "leader","display_name": "leader","description": "leader","role_id": 4,"user_type": "App\\Models\\User"
                    }
                }
            ]
        },{
            "id": 2,"name": "konna","email": "konna@user.com","pivot": {
                        "user_id": 2,{
                    "id": 3,"user_type": "App\\Models\\User"
                    }
                }
            ]
        }
    ]
}

这将返回这两个用户拥有的所有角色(他们都属于同一个团队)

我们如何选择用户在团队中的角色?

我想到了以下几点: 使用 $users 查询获取所有用户记录,然后从中选择用户的角色。

 foreach ($users as $user){
        $userArray[] = array_push($userArray,$user->name,$user->roles->first());
    }

但是,这将返回附加到用户的 first() 或 last() 角色,这些角色可以是任何内容(尤其是当用户可能属于多个团队时,他所参加的每个团队都有不同的角色)。

所以我的问题是,如何显示团队中用户的角色?

我在想:

$user->roles->where($team->id)

但这会返回附加到用户的所有角色,而不是用户在团队中拥有的特定角色。

感谢任何帮助。

解决方法

我对 Laratrust 没有经验,但我觉得我有你需要的解决方案。如果我们分解 source code,我们可以看到您的 UserTrait 包含一个 Role 关系。更重要的是,我们可以看到它包含 Team 模型的枢轴。

if (Config::get('laratrust.teams.enabled')) {
    $roles->withPivot(Config::get('laratrust.foreign_keys.team'));
}

将其与 wherePivot() 具有的方法 Laravel 相结合,您将能够执行以下操作来检索给定团队的用户角色。因此,如果您使用条件,您将检索所有角色,通过 Laratrust 的工作方式,您可以拥有多个角色。

$rolesInTeam = $user->roles()->wherePivot(Config::get('laratrust.foreign_keys.team'),$team)->get();
,

感谢@mrhn 的宝贵意见

我的解决方案如下:

$rolesInTeam[] = null;
$users = User::whereRoleIs($roles->pluck('name')->toArray(),$team)->get();

foreach ($users as $user){
$rolesInTeam[] = array_push($rolesInTeam,$user->roles()->wherePivotIn(Config::get('laratrust.foreign_keys.team'),$team)->get());
}

结果返回:

    null,[
        {
            "id": 4,"name": "leader","display_name": "Leader","description": "Leader","created_at": "2021-07-12T11:29:08.000000Z","updated_at": "2021-07-12T11:29:08.000000Z","pivot": {
                "user_id": 1,"role_id": 4,"user_type": "App\\Models\\User"
            }
        }
    ],2,[
        {
            "id": 3,"name": "user","display_name": "User","description": "User","pivot": {
                "user_id": 2,"role_id": 3,4,"pivot": {
                "user_id": 5,6```