【问题标题】:Laratrust show user role inside of teamLaratrust 在团队内部显示用户角色
【发布时间】:2021-07-12 15:25:35
【问题描述】:

我正在尝试在团队和用户之间建立联系。 几乎 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",
                    "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"
                    }
                }
            ]
        },
        {
            "id": 2,
            "name": "konna",
            "email": "konna@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": 2,
                        "role_id": 3,
                        "user_type": "App\\Models\\User"
                    }
                },
                {
                    "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": 2,
                        "role_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)

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

感谢任何帮助。

【问题讨论】:

    标签: laravel laravel-7 eloquent-relationship laratrust


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢您的回复。我会试试这个,如果它有效,请告诉你
    【解决方案2】:

    感谢@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",
                "created_at": "2021-07-12T11:29:08.000000Z",
                "updated_at": "2021-07-12T11:29:08.000000Z",
                "pivot": {
                    "user_id": 2,
                    "role_id": 3,
                    "user_type": "App\\Models\\User"
                }
            }
        ],
        4,
        [
            {
                "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": 5,
                    "role_id": 3,
                    "user_type": "App\\Models\\User"
                }
            }
        ],
        6```
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多