2017-04-17 2 views
1

Ich untersuche eine Möglichkeit, GraphQL zwischen React.js Client-Anwendung und Server-Anwendung zu verwenden, die auf relationalen SQL-Datenbank aufgebaut ist. Eine Abfrage sollte auf Client-Seite einschließlich komplexer SQL-Stil Aussagen wie erstellt werden:Unterstützt GraphQL serverseitige Filterung (d. H. Erstellen von WHERE-ähnlichen Abfragen auf Clientseite)?

WHERE Customer.Age BETWEEN 22 AND 25 
AND Order.Status = 'Active' 
OR Product.Name LIKE '%foo%' 

Es bedeutet, dass der Kunde in der Regel nur eine kleine Teilmenge von Datensätzen erhalten soll (zB 10 statt 10 Mio).

Dieses Schauen gut Phil Sturgeon article erklärt seltsame Dinge:

Ich hatte gehofft, GraphQL Kunden ihre eigenen Bereiche helfen könnte definieren, Filterung diese selbst die entsprechenden Daten sein enthält, die helfen die scoped umfasst identifizieren würde Die API sollte als Convenience-Methoden hinzufügen.

Es scheint, als würde GraphQL API-Entwicklern in diesem Fall nicht helfen, , aber es scheint zu sprechen, @filter hinzuzufügen, um dies in der Zukunft zu tun.

In der Zukunft? Keine Filterung in GraphQL? Ich fuhr fort zu erforschen und habe this SO question und dieses amazing interactive Graphcool documentation gefunden. Beide Beispiele verwenden ein Feature filter mit einem Satz von Postfix wie _gte genannt:

query combineMovies { 
    allMovies(filter: { 
    OR: [{ 
     AND: [{ 
     releaseDate_gte: "2009" 
     }, { 
     title_starts_with: "The Dark Knight" 
     }] 
    }, { 
     title: "Inception" 
    }] 
    }) { 
    title 
    releaseDate 
    } 
} 

Allerdings gibt es keine Vorgabe für die filter Schlüsselwort bei http://graphql.org. Ich überprüfte sogar Relay Docs und habe keine guten Beispiele für komplizierte Filterung gefunden (vielleicht weil ich keine React-Erfahrung habe).

Bitte verdeutlichen Sie die Fähigkeiten von GraphQL, komplexe SQL WHERE-ähnliche Abfragen zu erstellen. Ist es ein Teil von Standard oder nur ein schwach unterstütztes Nebenmerkmal?

Antwort

4

Ich fuhr fort, Forschung und habe diese SO Frage gefunden und diese amazing interactive Graphcool documentation.

Danke für die freundlichen Worte! Ich bin der Autor dieses Artikels, froh, dass es hilfreich war! Lassen Sie mich Ihre Frage aus der Perspektive der Graphcool API beantworten.

GraphQL Abfragen und Felder

GraphQL Abfragen werden über Felder gebaut. Hier verwenden wir die id Feld definiert auf dem allMovies Feld:

query allMovies { 
    allMovies { 
    id 
    } 
} 

I this article auf der Terminologie für weitere Informationen empfehle die Lektüre rund um GraphQL Abfragen.

Abfrage Arguments

GraphQL definiert query arguments so genannt, die auf Feldern angebracht werden können. Diese Argumente codieren zusätzliche Informationen für den GraphQL-Server und beeinflussen, wie das Feld aufgelöst wird.Ein gängiges Beispiel ist das first Abfrage Argument:

query firstMovie { 
    allMovies(first: 1) { 
    id 
    } 
} 

filtert einen Teil der Beschreibung oder nur eine Seite Features?

Lets weiter untersuchen!

query darkKnightMovies { 
    allMovies(filter: { 
    title_contains: "Dark Knight" 
    }) { 
    id 
    } 
} 

In der obigen Abfrage, filter ist ein Argument für das allMovies Feld. Der syntaktische Aspekt davon ist in der GraphQL-Spezifikation wie oben beschrieben definiert. GraphQL gibt jedoch nicht an, wie dieses Argument die Auflösung des Felds allMovies ändern soll. Dies wird nur durch das geänderte Verhalten des Resolvers für das Feld allMovies im GraphQL-Backend bestimmt.

Schlussfolgerung

GraphQL bietet alle notwendigen Konzepte (Abfragen, Felder, Argumente) serverseitige Filterung zu unterstützen. Allerdings mit diesen Konzepten zu bestimmten Verhalten wie Filterung zu verschlüsseln, ist der Entwickler, der eine GraphQL-API erstellt.

Verwandte Themen