2016-12-21 1 views
2

Angenommen ich ein GraphQL Schema wie diese:Wie Abfrage für dynamische Menge von Aliasen?

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

Ich weiß, wie für einen Benutzer durch seine ID abfragen, und ich kann Aliasnamen für mehrere Benutzer wie so abzufragen verwenden:

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

Ich nehme jedoch an, ich habe nur eine Liste von Benutzer-IDs und möchte die Namen jedes einzelnen abfragen. Wie würde ich eine solche Abfrage schreiben?

Die Ansätze, die ich mir vorstellen kann, ist Ether dynamisch generieren eine Abfrage mit Aliasen wie user1, user2, etc., oder eine users(ids: [ID]) Rand auf dem Server implementieren. Aber ich denke, es sollte eine bessere Lösung geben. Ist da?

(PS: meine Code-Beispiele könnten Syntaxfehler haben, schreibe ich es mehr als Pseudo-Code, meinen Punkt herüber zu erhalten.)

Antwort

2

Sie können diese Funktionalität als Teil Ihres Schemas implementieren, z. B. mit einem id_in: [String]-Argument für die Abfrage users.

Bei Graphcool verwenden wir das Argument filter, um solche Funktionen verfügbar zu machen.

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

Ergebnisse in

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

Um mehr über das filter Argument Prüflesevorgang the documentation: Zum Beispiel könnte Ihre Abfrage wie folgt durchgeführt werden.

+0

Ok, das scheint ziemlich brauchbar zu sein, und ich sehe, dass es eine Obermenge der vorherigen "Ein-Benutzer" -Ecke ist. Es scheint jedoch sinnvoll zu sein, nur einen einzigen Benutzer zu erreichen (die Anwendungsfälle von Benutzern sehen genau so aus). Denkst du, man sollte die "one user" -Kante entfernen und einfach mit deiner Lösung gehen oder beides behalten? – Ludwik

+1

Ja, es macht viel Sinn! Wir haben auch die 'Benutzer'-Abfrage, um einen' Benutzer' zurückzugeben. Es akzeptiert das Argument 'id' oder ein beliebiges Feld des Modells 'Benutzer', das Sie in unserer Konsolenbenutzeroberfläche als 'eindeutig' deklariert haben. Wenn Sie beispielsweise eindeutige Namen für Benutzer haben, können Sie wie folgt abfragen: 'query {Benutzer (Name:" John ") {id}}' – marktani

+0

Hallo @marktani!Ist Ihre Implementierung von 'Filter' in Open Source? :) –

2

ich mit dem letzten Satz gehen würde:

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

mit einem Resolver wie:

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

Hinweis: ich benutze + + um mein Schema, meine Typen und meine Resolver zu erstellen.

+0

Bedeutet dies, dass es in GraphQL keine integrierte Funktion dafür gibt? – Ludwik

+1

Ich glaube nicht. GraqhQL hat nichts Magisches: Wenn Sie mit komplexen Abfragen beginnen, müssen Sie viele Codes schreiben, um das Ergebnis zu erzeugen. :) –

+1

Ich bevorzuge auch diesen Ansatz. Es zeigt an, welche Benutzer auf schlanke und einfache Weise abrufen können. Die Verwendung von 'filter',' * _in', 'AND',' OR' zwingt die Client-Seite dazu, in DB zu denken - kein gutes GraphQL API Design, IMHO. –

Verwandte Themen