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 :).
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