繁体   English   中英

GraphQL:在同一查询中使用输入类型及其字段之一

[英]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
      }
    }
  }
}

然而,重复很可能实际上是一件好事。 你不会在野外遇到太多这些场景,因为我们正在处理数据 playersteammembers字段都是层次结构的一部分,其中父字段约束子字段返回的数据——例如, members不返回所有成员,只返回特定团队的成员。 这意味着,在大多数情况下,如果您限制players仅包含来自特定位置的数据,那么您也会限制由子字段(如members )返回的数据。 如果您觉得members需要自己的location参数,那么这意味着两个位置输入可能不同 如果它们可能不同,则应将它们表示为两个单独的变量,以最大限度地提高灵活性和查询重用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM