Załóżmy, że masz typ GraphQL i zawiera on wiele pól. Jak sprawdzić wszystkie pola bez zapisywania długiego zapytania zawierającego nazwy wszystkich pól?
Na przykład, jeśli mam te pola:
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'
]
];
}
Aby zapytać o wszystkie pola, zwykle zapytanie wygląda mniej więcej tak:
FetchUsers{users(id:"2"){id,username,count}}
Ale chcę mieć takie same wyniki bez wpisywania wszystkich pól, coś takiego:
FetchUsers{users(id:"2"){*}}
//or
FetchUsers{users(id:"2")}
Czy jest na to sposób w GraphQL?
Używam Folkloreatelier / laravel-graphql bibliotekę.
php
laravel
graphql
graphql-php
BlackSigma
źródło
źródło
Odpowiedzi:
Niestety to, co chciałbyś zrobić, nie jest możliwe. GraphQL wymaga, abyś wyraźnie określił, które pola mają być zwracane z zapytania.
źródło
Tak, możesz to zrobić za pomocą introspekcji . Utwórz zapytanie GraphQL, takie jak (dla typu UserType )
a otrzymasz odpowiedź taką jak (rzeczywiste nazwy pól będą zależeć od aktualnej definicji schematu / typu)
Następnie możesz przeczytać tę listę pól w swoim kliencie i dynamicznie utworzyć drugie zapytanie GraphQL, aby uzyskać wszystkie te pola.
Zależy to od tego, czy znasz nazwę typu, dla którego chcesz uzyskać pola - jeśli nie znasz typu, możesz zebrać wszystkie typy i pola razem za pomocą introspekcji, np.
UWAGA: to są dane GraphQL over-the-wire - jesteś sam, aby dowiedzieć się, jak czytać i pisać z rzeczywistym klientem. Twoja biblioteka GraphQL javascript może już w pewnym stopniu wykorzystywać introspekcję, na przykład polecenie apollo codegen używa introspekcji do generowania typów.
źródło
Myślę, że jedynym sposobem na to jest wykorzystanie fragmentów wielokrotnego użytku:
źródło
Napotkałem ten sam problem, gdy musiałem załadować dane o lokalizacji, które zserializowałem do bazy danych z Google Places API. Generalnie chciałbym mieć całość, aby działała z mapami, ale nie chciałem za każdym razem określać wszystkich pól.
Pracowałem w Rubim, więc nie mogę dać Ci implementacji PHP, ale zasada powinna być taka sama.
Zdefiniowałem niestandardowy typ skalarny o nazwie JSON, który po prostu zwraca dosłowny obiekt JSON.
Implementacja ruby była taka (używając graphql-ruby)
Potem użyłem go do naszych obiektów
Używałbym tego jednak bardzo oszczędnie, używając go tylko wtedy, gdy wiesz, że zawsze potrzebujesz całego obiektu JSON (tak jak w moim przypadku). W przeciwnym razie, mówiąc bardziej ogólnie, pokonuje obiekt GraphQL.
źródło
{"en": "Hello", "es": "Hola"}
. A ponieważ każdy użytkownik może zaimplementować własny podzbiór języków dla swojego przypadku użycia, nie ma sensu, aby interfejs użytkownika sprawdzał każdy możliwy podzbiór. Twój przykład działa doskonale.Format zapytań GraphQL został zaprojektowany, aby umożliwić:
Jednak zgodnie z dokumentacją GraphQL , możesz tworzyć fragmenty , aby ułatwić wielokrotne użycie zestawów wskazań :
Następnie możesz zapytać o wszystkie szczegóły użytkownika poprzez:
Możesz również dodać dodatkowe pola obok swojego fragmentu :
źródło
Pakiet graphql-type-json obsługuje niestandardowe skalary typu JSON. Użyj go, aby pokazać wszystkie pola obiektów json. Oto link do przykładu w ApolloGraphql Server. https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars
źródło