GraphQL服务器-如何在字段解析程序中传递多个级别的根

GraphQL服务器-如何在字段解析程序中传递多个级别的根,graphql,apollo-server,Graphql,Apollo Server,我只是从阿波罗图形开始。我有一个这样的结构 运动游戏->团队->球员 我有一个模式,我可以得到所有的体育比赛,一个与所有球队,一个与所有球员,所有这一切都是好的。我还实现了通过他们的id获取每个人 然后,我为团队和球员编写了现场解决方案,这一切都很好,让团队参与体育比赛,或者让球员参与团队 因此,这些类型的查询很好,可以为给定的体育比赛提供球队名称 query Query { sportsgame(gameId: "12345") { teams { name }

我只是从阿波罗图形开始。我有一个这样的结构

运动游戏->团队->球员

我有一个模式,我可以得到所有的体育比赛,一个与所有球队,一个与所有球员,所有这一切都是好的。我还实现了通过他们的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可以获取根对象,即团队,但它不能获取位于顶部的sportsgame,因此我无法访问sportsgame的id以进一步筛选玩家列表


我的问题是,我是否应该将sportsgame id作为可选的隐藏数据传递给团队?还是说阿波罗号上有更惯用的方式来做这类事情?或者我正在做一些概念上奇怪的事情,甚至试图让它工作?

你也可以尝试为玩家添加一个参数。大概是

query Query {
  sportsgame(externalId: "12345") {
    teams {
      name
      players(gameId: "12345") {
        name
      }
    }   
  }
}
通过这种方式,您可以从解析器args获取游戏ID

为了不复制游戏ID,您可能需要将参数提取到查询组件中

query Query($gameId: String!) {
  sportsgame(externalId: $gameId) {
    teams {
      name
      players(gameId: $gameId) {
        name
      }
    }   
  }
}

可以将上下文对象用于嵌套的冲突解决程序

解析程序函数的签名为:

fieldName(obj, args, context, info) { result }
context
是特定查询中所有解析程序共享的对象,用于包含每个请求的状态。


这意味着,在
sportgame
的解析程序中,您可以在上下文对象上设置gameId,并在
players
的解析程序中使用它。您如何知道某个玩家是否在该事件中玩?我们的apollo实现连接到一个数据库,在该数据库中,我们可以对玩家、团队和事件进行筛选。所以我们只需查询数据库中的信息。是的,在某些情况下是可行的,但是如果你想要一个运动游戏列表,每个游戏中的玩家,那么全局上下文只能存储一个运动游戏id。是的,如果参数化了,听起来不错,我仍然担心,消费者不会意识到他们必须为玩家传递gameId才能将其限制在游戏中的玩家。也许这只是一个命名问题。