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