Wie man ein polymorphes Modell mit Sequelize und GraphQL richtig einrichtet

9

Ich versuche gerade React zu lernen, indem ich eine Essensplaner-App für mich selbst entwickle. Ich komme aus einer traditionellen Business-Programmierwelt und habe mich für MySQL als Backend und Sequelize / GraphQL als Datenschnittstelle entschieden.

Ich habe ein Datenmodell, das wie folgt aussieht:
-Benutzer haben Mahlzeiten -Mahlzeiten haben die Eigenschaften von Tag, Typ (Frühstück, Mittagessen, etc.) und "MealItems" -MealItems kann entweder ein FoodItem oder ein Rezept sein -Recipes sind im Grunde eine Sammlung von FoodItems

Ich habe diese Idee mit diesem Datenschema umgesetzt (ein wirklich schnelles Modell in Access): Meal Planner Model

Ich habe es geschafft, ein Sequelize-Modell zu erstellen, das die Tabellen und Einschränkungen genau so erstellt, wie ich es möchte. Ich habe das n: m-Assoziationsbeispiel aus der offiziellen Sequelize-Dokumentation verwendet, um die MealItems-Nachschlagetabelle zu erstellen, die es dem Modell ermöglichen soll, basierend auf dem Geltungsbereich ("ItemType") entweder ein FoodItem oder ein Rezept dynamisch zurückzugeben. (Aber ich weiß nicht, ob ich diesen Teil richtig gemacht habe, da ich es nicht schaffen kann, die Daten tatsächlich durch andere als reine SQL-Abfragen zu ziehen.)

Der vollständige Quellcode für mein Projekt finden Sie hier: (die relevanten Datenkomponenten sind unter './src/data') Ссылка

Sequelize-Modell:

%Vor%

Ich habe GraphQL-Typen und Abfragen eingerichtet, um alle Daten mit Ausnahme von Meal zurückzugeben. Ich bekomme nichts zurück, außer die Werte, die tatsächlich in der MealItem-Tabelle enthalten sind. Ich war in der Lage, FoodItem zu Rezept kein Problem zu verknüpfen, und ein JSON-Paket abrufen, das FoodItems in Rezepte eingebettet hat, aber nicht herausfinden, wie das gleiche mit MealItems zu tun. Dies ist das Modell, wie ich es jetzt habe: [Visualisierung des GraphQL-Modells wie es ist] [3] Aber ich möchte, dass Mahlzeiten in der Ausgabe entweder FoodItems oder Rezepte enthalten und nicht MealItems.

Und das ist mein GraphQL-Code, wie ich es funktioniere:

%Vor%


Was ich denken muss, um zu erreichen, dass der MealType entweder einen FoodType oder einen RezeptTyp anstelle von MealItemType dynamisch zurückgibt, ist etwas in dieser Richtung. Aber das ist, was ich nicht zur Arbeit bringen kann, und ist der Grund für diese extrem lange Frage.

%Vor%

Aktuelle Abfrage und Ausgabe:

%Vor%

Gewünschte Abfrage und Ausgabe:

%Vor%     
phil 07.02.2017, 16:31
quelle

1 Antwort

4

Setzen Sie keinen Schlüssel resolver direkt in einem GraphQLObjectType :

%Vor%

Dann hatten Sie Recht, GraphQLUnionType zu verwenden.
Aber in der Auflösungsfunktion von MealType sollten Sie ein fusioniertes Array von FoodItems und Recipes und keine Einträge der Tabelle MealItems zurückgeben. Sie sagen mit der Vereinigung "Ich gebe eine Liste von entweder FoodItem oder Rezept zurück", also sollten Sie dies tun.

Also,

%Vor%     
whitep4nther 15.06.2017 08:18
quelle

Tags und Links