1

我有 3 个表:角色、团队、用户,每个表之间都有一个数据透视表:role_team、role_user、team_user。

我很难利用 Eloquent 仅返回用户在特定团队中拥有的角色。

$team = Team::find(1);
foreach($team->users as $user) {
    dump($user->teamRoles); // Get the roles this user has for the team
}

虽然可以$user->roles()->where('team_id', $team->id)->get(),但我想将其指定为关系。我尝试设置 a hasManyThrough,但在这种特定情况下似乎不起作用。

需要将其用作关系而不是查询是因为我将 Lighthouse PHP 用于 GraphQL,并且希望能够轻松地查询以下角色:

teams {
  id name 
  users {
    teamPivot {
      roles { id name }
    }
  }
}

任何利用 Eloquent 来实现这一点的帮助将不胜感激。

4

2 回答 2

0

一种可能的解决方案(尽管不一定是我要寻找的解决方案)是@method在字段上使用指令。

想象一下以下架构:

type User {
  id: ID!
  email: String!
  teams: [Team] @belongsToMany
  teamMeta: TeamUser
}

type Team {
  id: ID!
  name: String!
  users: [User] @belongsToMany
  userMeta: TeamUser
}

type Role {
  id: ID!
  name: String!
  team: Team @belongsTo
  users: [User] @belongsToMany
}

type TeamUser {
  user: User!
  team: Team!
  roles: [Role] @method(name: "getTeamRoles")
}

哪里getTeamRoles看起来像:

public function getTeamRoles()
{
  return $this->user->roles()->where('team_id', $this->team->id)->get();
}

此配置将允许以下 GraphQL 按需要工作:

  users(first: 1, input: { id: 2 }) {
    email teams {
      name userMeta {
        contactedAt
        roles { id name }
      }
    }
  }

这是我目前正在运行的解决方案,但如果有一个“纯”的 Eloquent 答案,而不是为这种类型的每个关系编写自定义访问器,那就太好了。

于 2019-11-21T17:22:28.627 回答
0

我认为你可以通过使用Many to Many关系来实现你想要的。

基本上,您将需要定义编写一个方法,该belongsToMany方法在模型UserRoles模型中都返回该方法的结果。

它会是这样的:

User.php

 public function roles(){
     return $this->belongsToMany('App\Role');
 }

Role.php

public function users(){
    return $this->belongsToMany('App\User');
}

然后,您将能够执行以下操作:

$team = Team::find(1);
foreach($team->users as $user) {
    dump($user->roles); 
}

更多参考可以查看官方文档:https ://laravel.com/docs/6.x/eloquent-relationships#many-to-many

我希望这有帮助。

于 2019-11-21T17:23:42.883 回答