2017-10-02 2 views
0

Ich versuche, ein GraphQL-Schema mit einem Typ, der verschiedene Felder hat, und ermöglicht es Ihnen auch auf eine OR: [...] rekursiv mit den gleichen Argumente zu heften. Ich habe es wie die Arbeit dieserGraphQL - Spread Eingabe Args

input BookFilters { 
    _id: String 
    title: String 
    title_contains: String 
    title_startsWith: String 
    title_endsWith: String 
    OR: [BookFilters] 
} 

type Query { 
    allBooks(_id: String 
    title: String 
    title_contains: String 
    title_startsWith: String 
    title_endsWith: String 
    OR: [BookFilters] 
    ): [Book] 
} 

die großen Werke, und diese Abfrage

{ 
    allBooks(title_endsWith: "1", OR: [{ title: "2" }, {title:"3"}, {OR: [{title_contains: "Q"}, {OR:[{title:"Q"}]}]}]) { 
    _id 
    title 
    } 
} 

geht durch ganz gut.

Meine Frage ist, gibt es eine Möglichkeit, die Duplizierung zu entfernen? Im Idealfall würde ich es lieben, wenn

war gültig, aber es scheint nicht zu sein.


Bearbeiten - Ein Kommentar brachte Fragmente. Sie können nur von eine Art, richtig deklariert werden? Also würde ich immer noch einen neuen Typ erstellen, der alle meine Abfrageargumente auflistet, und dann ein Fragment daraus machen und alle Felder erneut auflisten?

Auch wenn das nicht so ist, scheint sich GraphQL immer noch nicht auf Eingabeargumente auszubreiten.

fragment BookFiltersFragment on BookFilters { 
    _id 
} 

type Query { 
    allBooks(...BookFiltersFragment): [Book] 
} 

die Fehler heraus auf dem ...

+0

Das bin ich von Fragmenten erinnert. Überprüfen Sie dies: http://dev.apollodata.com/react/fragments.html – agm1984

+0

Entschuldigung, dass Apollo, überprüfen Sie die Vanille-Dokumente, wenn Sie das verwenden. – agm1984

+1

Ja - ich habe Fragmente gesehen. Sie sind jedoch nur für einen Typ deklariert, oder? Trotzdem, es scheint, ich kann immer noch nicht ein Fragment auf Abfrage Argumente zu verbreiten –

Antwort

0

Wir unser Schema von einfachen JS bauen statt in der Abfragesprache und sind in der Lage, die Ausbreitung zu verwenden, da unsere Argumente plain-old-Javascript-Objekte sind. Ich glaube, dass "GraphQLInputType" eine vollwertige Instanziierung ist, die keine einfache Verbreitung erlaubt.

0

Ich verstehe nicht, was Sie wollen, dass das Fragment verteilt, als Argumente zu tun, also kann ich das nicht kommentieren. Wenn es angenommen hat, ein Rest Parameter sein, ich denke, das besser ist, die Doppelarbeit zu vermeiden:

input BookFilter { 
    _id: String 
    title: String 
    title_contains: String 
    title_startsWith: String 
    title_endsWith: String 
    OR: [BookFilter] 
    AND: [BookFilter] 
} 

type Query { 
    bookSearch(filter: BookFilter): [Book] 
} 

Dann können Sie tun:

{ 
    allBooks({ AND: [ 
    {title_endsWith: "1"} 
    {OR: [ 
     {title_startsWith:"2"}, 
     {title_startsWith:"3"} 
    ]} 
    ]} { 
    _id 
    title 
    } 
} 

Die Optionen von AND und OR erlauben würde, Sie machen Logikbaum. Die obige Abfrage würde 21 und 31, aber nicht 22 oder 41 entsprechen.

+0

Weil das nicht wirklich funktioniert :('{ { allBooks (Titel: "a"). { _id Titel } }' führt den Fehler "unknown Argument Titel" Wenn es gibt ein einziges Argument, 'Filter ', dann erwartet er die Abfrage sein' { allBooks (Filter: {title: "a"}) { _id Titel } } 'was natürlich will ich nicht, dass ich die Argumente wollen zu bekommen. passierte gleich wie Sie versuchten, oben. –

+0

Ah, auch versucht '{ allBooks ({Titel:" a "}) { _id Titel } } '(mit Titel, der in ein Objektliteral eingeschlossen ist), aber das scheint nur ungültig zu sein. –