雄辩的团队角色

时间:2019-11-21 17:09:02

标签: laravel eloquent graphql laravel-lighthouse

我有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(),但我想将其指定为一种关系。我尝试设置hasManyThrough,但在这种情况下似乎不起作用。

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

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

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

2 个答案:

答案 0 :(得分: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 }
      }
    }
  }

这是我目前正在运行的解决方案,但最好为此提供一个“纯”口才的答案,而不必为此类型的每个关系编写自定义访问器。

答案 1 :(得分:0)

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

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

会是这样的:

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

我希望这会有所帮助。