我只是从Apollo GraphQL开始。我有一个类似
的结构体育游戏->球队->球员
我有一个模式,我可以得到所有的体育游戏,一个可以与所有团队进行比赛,而一个可以与所有玩家进行比赛,所有这些都很好。我还实现了按他们的ID获取每个人。
然后我为团队和球员编写了场解析器,这对于让体育比赛团队或团队球员发挥作用都很好,
这样的查询很好,可以给我给定体育比赛的球队名称。
query Query {
sportsgame(gameId: "12345") {
teams {
name
}
}
}
同样,对于玩家我可以查询:
query Query {
teams {
name
players {
name
number
}
}
}
}
那也很好,给我列出了所有球队和每个球员的名单。
接下来,我想实现让所有团队成员参加体育比赛的方式,
query Query {
sportsgame(externalId: "12345") {
teams {
name
players {
name
}
}
}
}
但是问题是,我不希望这些团队的所有玩家,只希望真正参加比赛的玩家。这就要求我的fieldResolver最了解体育游戏。
因此,我的fieldResolver可以获取作为团队的Root对象,但不能将体育游戏置于顶部,因此我无法访问体育游戏的ID来进一步过滤玩家列表。
我的问题是,我是否应该将体育游戏ID作为可选的隐藏数据通过团队传递?还是在Apollo中更惯用的方式来做这种事情?还是我尝试做这项工作时在概念上有些奇怪?
答案 0 :(得分:1)
您也可以尝试向玩家添加参数。像
query Query {
sportsgame(externalId: "12345") {
teams {
name
players(gameId: "12345") {
name
}
}
}
}
通过这种方式,您可以从解析程序参数中获取游戏ID。
要不复制游戏ID,您可能需要将参数提取到查询组件中。
query Query($gameId: String!) {
sportsgame(externalId: $gameId) {
teams {
name
players(gameId: $gameId) {
name
}
}
}
}
答案 1 :(得分:1)
您可以将上下文对象用于嵌套的解析器。
解析器功能的签名为:
fieldName(obj, args, context, info) { result }
context
是特定查询中所有解析程序共享的对象,用于包含每个请求状态。 From the apollo page
这意味着,在sportgame
的解析器中,您需要在上下文对象上设置gameId并将其在players
的解析器中使用。