我正在尝试在团队和用户之间建立联系。 几乎 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)
但这会返回附加到用户的所有角色,而不是用户在团队中拥有的特定角色。
感谢任何帮助。
答案 0 :(得分:1)
我对 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();
答案 1 :(得分:0)
感谢@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```