2016-12-21 22 views
2

假設我有一個GraphQL模式是這樣的:如何查詢動態數量的別名?

Schema { 
    user($id: ID) { 
    id: ID 
    name: String 
    } 
} 

我知道如何通過自己的ID爲一個用戶查詢,我可以使用別名來查詢多個用戶,像這樣:

GetSomeMore { 
    john: user(id: "123") { 
    name 
    } 
    mary: user(id: "321") { 
    name 
    } 
} 

但是,假設我只有一個用戶ID列表,並且想要查詢它們中的每一個的名稱。我將如何編寫這樣的查詢?

我可以想出是醚動態地生成具有別名的查詢等user1user2等,或在服務器上實現一個users(ids: [ID])邊緣的方法。但我覺得應該有更好的解決方案。在那兒?

(PS:我的代碼示例可能有語法錯誤,我寫它更像僞代碼,使對方瞭解我的觀點。)

回答

2

您可以將該功能實現爲模式的一部分,例如查詢的參數爲id_in: [String]

在Graphcool中,我們使用filter參數來公開這樣的功能。例如,查詢可以做這樣的:

query { 
    allUsers(filter: {id_in: ["123", "321"]}) { 
    id 
    name 
    } 
} 

結果

{ 
    "data": { 
    "allUsers": [ 
     { 
     "id": "123", 
     "name": "John" 
     }, 
     { 
     "id": "321", 
     "name": "Mary" 
     } 
    ] 
    } 
} 

要了解更多關於filter參數檢查the documentation

+0

好的,這看起來很有用,我看到它是前一個「一個用戶」邊緣的超集。然而,只有一個用戶才能獲得優勢似乎很實際(man用例看起來就像這樣)。你認爲應該刪除「一個用戶」的優勢,只是去解決方案,或保持兩個? – Ludwik

+1

是的,它很有意義!我們也有'User'查詢來返回一個'User'。它接受'id'參數,或者在我們的控制檯UI中聲明爲'unique'的'User'模型上的任何字段。例如,如果你有唯一的用戶名,你可以這樣查詢:'query {User(name:「John」){id}}' – marktani

+0

Hi @marktani!您是否在開放源代碼中實施「過濾器」? :) –

2

我要和你最後的命題去:

Schema { 
    users($ids: [ID]) { 
    id: ID 
    name: String 
    } 
} 

隨着解析器,如:

const users = async (root, { ids }) => await knex('users').whereIn('id', ids) 

注:我用 + + 來創建我的模式,我的類型和我的解析器。

+0

這是否意味着在GraphQL中沒有內置的功能? – Ludwik

+1

我不這麼認爲。 GraqhQL沒有什麼魔力:當你開始做複雜的查詢時,你必須編寫很多代碼才能生成結果。 :) –

+1

我也更喜歡這種方法。它告訴哪些用戶以精簡而簡單的方式獲取。使用'filter','* _in','AND','OR'強制客戶端根據數據庫思考 - 並不是一個好的GraphQL API設計,恕我直言。 –