2017-07-21 6 views
2

Ich suche für 2 Objekte, die beide in der gleichen Komponente benötigt werden. Das Problem ist, dass eine der Abfragen auf die andere warten muss und ihr Feld id als Argument für die andere verwendet. Ich bin mir nicht sicher, wie ich das umsetzen soll.GraphQL verwenden Feldwert als Variable für eine andere Abfrage

const PlayerQuery = gql`query PlayerQuery($trackId: Int!, $duration: Int!, $language: String!) { 
    subtitle(trackId: $trackId, duration: $duration) { 
    id, 
    lines { 
     text 
     time 
    } 
    } 
    translation(trackId: $trackId, language: $language, subtitleId: ???) { 
    lines { 
     translation 
     original 
    } 
    } 
}`; 

So in der Abfrage oben translation muss subtitleId als Argument, die von der subtitle Abfrage zurückgegeben wird.
Ich benutze Apollo sowohl auf dem Client als auch auf dem Server.

+0

Ich habe gerade erst mit GraphQL angefangen, aber von dem, was ich verstehe, ist das nicht möglich. Wenn 'Translation' von den' Untertiteln' oder 'Linientypen' im Schema referenziert wurde, wäre es wahrscheinlich möglich, da der Resolver das 'Untertitel'-Objekt erhalten würde. – robertklep

Antwort

5

Das ist eine gute Frage, weil es einen signifikanten Unterschied zwischen REST/RPC-APIs und GraphQL darstellt. In REST-Stil-APIs enthalten die von Ihnen zurückgegebenen Objekte nur Metadaten zum Abrufen weiterer Daten, und der API-Consumer muss wissen, wie die JOINs über diese Tabellen ausgeführt werden. In Ihrem Beispiel haben Sie eine subtitle und eine translation, die Sie mit der ID-Eigenschaft verbinden müssen. In GraphQL existieren Objekte selten isoliert und die Beziehungen sind im Schema selbst kodiert.

Sie haben Ihre schema nicht veröffentlicht, aber aus der Sicht, Sie erstellt ein translation Objekt und ein subtitle Objekt und legte sie beide in Ihrer Root-Abfrage. Meine Vermutung ist, dass es so etwas wie folgt aussieht:

const Translation = new GraphQLObjectType({ 
    name: "Translation", 
    fields: { 
    id: { type: GraphQLInt }, 
    lines: { type: Lines } 
    } 
}); 

const SubTitle = new GraphQLObjectType({ 
    name: "SubTitle", 
    fields: { 
    lines: { type: Lines } 
    } 
}); 

const RootQuery = new GraphQLObjectType({ 
    name: "RootQuery", 
    fields: { 
    subtitle: { type: SubTitle }, 
    translation: { type: Translation } 
    } 
}); 

module.exports = new GraphQLSchema({ 
    query: RootQuery 
}); 

Was Sie stattdessen tun sollten, ist eine Beziehung zu Übersetzungen wie diese INSIDE OF Untertitel zu machen. Das Ziel von GraphQL besteht darin, zunächst ein Diagramm oder Beziehungen in Ihren Daten zu erstellen und dann herauszufinden, wie Einstiegspunkte für diese Daten verfügbar gemacht werden. Mit GraphQL können Sie beliebige Teilbäume in einem Diagramm auswählen.

const Translation = new GraphQLObjectType({ 
    name: "Translation", 
    fields: { 
    id: { type: GraphQLInt }, 
    lines: { type: Lines } 
    } 
}); 

const SubTitle = new GraphQLObjectType({ 
    name: "SubTitle", 
    fields: { 
    lines: { type: Lines } 
    translations: { 
     type: Translation, 
     resolve:() => { 
     // Inside this resolver you should have access to the id you need 
     return { /*...*/ } 
     } 
    } 
    } 
}); 

const RootQuery = new GraphQLObjectType({ 
    name: "RootQuery", 
    fields: { 
    subtitle: { type: SubTitle } 
    } 
}); 

module.exports = new GraphQLSchema({ 
    query: RootQuery 
}); 

Hinweis: Aus Gründen der Übersichtlichkeit habe ich die Argumente Felder und alle zusätzlichen Resolver weggelassen. Ich bin mir sicher, dass dein Code ein bisschen ausgefeilter sein wird, ich wollte nur den Punkt verdeutlichen :).

+0

Vielen Dank für die Bestätigung meines Verdachts und eine angemessene Antwort :) – robertklep

+0

Wenn es Ihnen nichts ausmacht, können Sie auf das Häkchen klicken, um zu bestätigen, dass dies eine richtige Antwort ist? Sie haben es gerade aufgewertet (was ich auch schätze) :). – Baer

+0

Ich kann nicht wie ich war nicht derjenige, der die Frage stellt :) – robertklep

Verwandte Themen