[英]GraphQL: Use input type and one of its fields in the same query
我想知道如何在同一个 GraphQL 查询中将输入类型及其字段之一用作 arguments。 我认为有一些有效的解决方案,但我想知道哪些(如果有的话)是最佳实践。
考虑以下假设查询。 我们通过位置和状态获取玩家,以及处于同一位置的团队成员,但member
字段只有一个location
参数:
input PlayerInput {
location: String!
status: Int!
}
query getPlayers($playerInput: PlayerInput) {
players(playerInput: $playerInput) {
name
team {
name
members(location: ???) { // <-- How to access playerInput.location?
name
}
}
}
}
我可以想到几种方法来解决这个问题:
1.更改查询取个人arguments
query getPlayers($location: String!, $status: Int!) {
players(playerInput: { location: $location, status: $status }) {
name
team {
name
members(location: $location) {
name
}
}
}
}
2.更新架构,使members
采用正确的输入类型
query getPlayers($playerInput: PlayerInput) {
players(playerInput: $playerInput) {
name
team {
name
members(playerInput: $playerInput) { // <-- Requires changing schema
name
}
}
}
}
由于某些原因,这看起来不太好,并且只有在您能够更新模式时才有效。
3. 将location
作为冗余的单个参数传入
query getPlayers($playerInput: PlayerInput, $location: String!) {
players(playerInput: $playerInput) {
name
team {
name
members(location: $location) {
name
}
}
}
}
这看起来不错,只是在创建查询时有一些重复:
const location = 'US';
const status = 1;
fetch({
query: getPlayersQuery,
variables: {
location,
playerInput: {
location,
status,
}
}
})...
这些是做这样的事情的首选方式吗? 还有其他我没有考虑过的方法吗?
在采用输入类型(选项 #1)的单个参数上使用多个 arguments 有时在概念上是有意义的,但它缺乏任何其他真正的优点,并且具有使变量定义不必要地冗长的缺点。 在我看来,使用输入类型通常也能更好地强制输入。 仅仅为了避免重复而更改模式是不值得的。
在两个字段上使用相同的输入 object 类型(选项 #2)应该仅在两个字段实际上需要所有这些输入字段时才执行。 这样做只是为了避免重复是一个坏主意——它有效地引入了未使用的输入,这对于使用 API 的任何其他开发人员来说都不是一个好的体验。
选项#3 很好。 它还将球放在前端开发人员的法庭上——如果他们想避免重复,他们也可以轻松地做到这一点,而无需您引入额外的 arguments:
query getPlayers($status: Int!, $location: String!) {
players(playerInput: { status: $status, location: $location }) {
name
team {
name
members(location: $location) {
name
}
}
}
}
然而,重复很可能实际上是一件好事。 你不会在野外遇到太多这些场景,因为我们正在处理数据图。 players
、 team
和members
字段都是层次结构的一部分,其中父字段约束子字段返回的数据——例如, members
不返回所有成员,只返回特定团队的成员。 这意味着,在大多数情况下,如果您限制players
仅包含来自特定位置的数据,那么您也会限制由子字段(如members
)返回的数据。 如果您觉得members
需要自己的location
参数,那么这意味着两个位置输入可能不同。 如果它们可能不同,则应将它们表示为两个单独的变量,以最大限度地提高灵活性和查询重用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.