我有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实现这一目标的帮助将不胜感激。
答案 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
关系来实现想要的目标。
基本上,您需要定义一个写方法,该方法在belongsToMany
和User
模型中都返回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
我希望这会有所帮助。