簡體   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