Angenommen, Sie haben einen GraphQL-Typ, der viele Felder enthält. Wie kann man alle Felder abfragen, ohne eine lange Abfrage aufzuschreiben, die die Namen aller Felder enthält?
Zum Beispiel, wenn ich diese Felder habe:
public function fields()
{
return [
'id' => [
'type' => Type::nonNull(Type::string()),
'description' => 'The id of the user'
],
'username' => [
'type' => Type::string(),
'description' => 'The email of user'
],
'count' => [
'type' => Type::int(),
'description' => 'login count for the user'
]
];
}
Um alle Felder abzufragen, sieht die Abfrage normalerweise folgendermaßen aus:
FetchUsers{users(id:"2"){id,username,count}}
Aber ich möchte einen Weg finden, um die gleichen Ergebnisse zu erzielen, ohne alle Felder zu schreiben.
FetchUsers{users(id:"2"){*}}
//or
FetchUsers{users(id:"2")}
Gibt es eine Möglichkeit, dies in GraphQL zu tun?
Ich verwende die Folkloreatelier / Laravel-Graphql- Bibliothek.
php
laravel
graphql
graphql-php
BlackSigma
quelle
quelle
Antworten:
Leider ist das, was Sie tun möchten, nicht möglich. In GraphQL müssen Sie explizit angeben, welche Felder von Ihrer Abfrage zurückgegeben werden sollen.
quelle
Ja, Sie können dies mit Selbstbeobachtung tun . Machen Sie eine GraphQL-Abfrage wie (für Typ UserType )
und Sie erhalten eine Antwort wie (die tatsächlichen Feldnamen hängen von Ihrer tatsächlichen Schema- / Typdefinition ab).
Sie können dann diese Liste von Feldern in Ihrem Client lesen und dynamisch eine zweite GraphQL-Abfrage erstellen, um alle diese Felder abzurufen.
Dies setzt voraus, dass Sie den Namen des Typs kennen, für den Sie die Felder abrufen möchten. Wenn Sie den Typ nicht kennen, können Sie alle Typen und Felder mithilfe von Introspektion wie zusammenstellen
HINWEIS: Dies sind die drahtgebundenen GraphQL-Daten. Sie müssen selbst herausfinden, wie Sie mit Ihrem tatsächlichen Client lesen und schreiben können. Ihre graphQL-Javascript-Bibliothek verwendet möglicherweise bereits in gewisser Weise Introspektion. Beispielsweise verwendet der Befehl apollo codegen Introspektion, um Typen zu generieren.
quelle
Ich denke, der einzige Weg, dies zu tun, ist die Verwendung wiederverwendbarer Fragmente:
quelle
Ich hatte das gleiche Problem, als ich Standortdaten laden musste, die ich über die Google Places-API in die Datenbank serialisiert hatte. Im Allgemeinen möchte ich das Ganze, damit es mit Karten funktioniert, aber ich wollte nicht jedes Mal alle Felder angeben müssen.
Ich habe in Ruby gearbeitet, daher kann ich Ihnen die PHP-Implementierung nicht geben, aber das Prinzip sollte dasselbe sein.
Ich habe einen benutzerdefinierten Skalartyp namens JSON definiert, der nur ein wörtliches JSON-Objekt zurückgibt.
Die Ruby-Implementierung war so (mit graphql-ruby)
Dann habe ich es für unsere Objekte so benutzt
Ich würde dies jedoch sehr sparsam verwenden und es nur dort verwenden, wo Sie wissen, dass Sie immer das gesamte JSON-Objekt benötigen (wie ich es in meinem Fall getan habe). Andernfalls wird das Objekt von GraphQL allgemeiner besiegt.
quelle
{"en": "Hello", "es": "Hola"}
. Und da jeder Benutzer seine eigene Teilmenge von Sprachen für seinen Anwendungsfall implementieren kann, ist es für die Benutzeroberfläche nicht sinnvoll, jede mögliche Teilmenge abzufragen. Ihr Beispiel funktioniert perfekt.Das GraphQL-Abfrageformat wurde entwickelt, um Folgendes zu ermöglichen:
Gemäß der GraphQL-Dokumentation können Sie jedoch Fragmente erstellen , um Auswahlsätze wiederverwendbarer zu machen:
Dann können Sie alle Benutzerdetails abfragen, indem Sie:
Sie können neben Ihrem Fragment auch zusätzliche Felder hinzufügen :
quelle
Das Paket graphql-type-json unterstützt JSON mit benutzerdefinierten Skalaren. Verwenden Sie diese Option, um das gesamte Feld Ihrer JSON-Objekte anzuzeigen. Hier ist der Link des Beispiels in ApolloGraphql Server. https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars
quelle