Supposons que vous ayez un type GraphQL et qu'il inclut de nombreux champs. Comment interroger tous les champs sans écrire une longue requête qui inclut les noms de tous les champs?
Par exemple, si j'ai ces champs:
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'
]
];
}
Pour interroger tous les champs, la requête est généralement quelque chose comme ceci:
FetchUsers{users(id:"2"){id,username,count}}
Mais je veux un moyen d'avoir les mêmes résultats sans écrire tous les champs, quelque chose comme ceci:
FetchUsers{users(id:"2"){*}}
//or
FetchUsers{users(id:"2")}
Y a-t-il un moyen de faire cela dans GraphQL ??
J'utilise Folkloreatelier / Laravel-graphql bibliothèque.
php
laravel
graphql
graphql-php
BlackSigma
la source
la source
Réponses:
Malheureusement, ce que vous aimeriez faire n'est pas possible. GraphQL vous demande d'être explicite sur la spécification des champs que vous souhaitez renvoyer à partir de votre requête.
la source
Oui, vous pouvez le faire en utilisant l' introspection . Faire une requête GraphQL comme (pour le type UserType )
et vous obtiendrez une réponse comme (les noms de champ réels dépendront de votre définition réelle de schéma / type)
Vous pouvez ensuite lire cette liste de champs dans votre client et créer dynamiquement une deuxième requête GraphQL pour obtenir tous ces champs.
Cela dépend du fait que vous connaissiez le nom du type pour lequel vous souhaitez obtenir les champs - si vous ne connaissez pas le type, vous pouvez rassembler tous les types et champs en utilisant une introspection comme
REMARQUE: ce sont les données GraphQL over-the-wire - vous êtes seul pour comprendre comment lire et écrire avec votre client réel. Votre bibliothèque javascript graphQL peut déjà utiliser l'introspection dans une certaine capacité, par exemple la commande apollo codegen utilise l'introspection pour générer des types.
la source
Je suppose que le seul moyen de le faire est d'utiliser des fragments réutilisables:
la source
J'ai rencontré le même problème lorsque j'ai eu besoin de charger des données de localisation que j'avais sérialisées dans la base de données à partir de l'API google places. En général, je voudrais que tout cela fonctionne avec des cartes, mais je ne voulais pas avoir à spécifier tous les champs à chaque fois.
Je travaillais dans Ruby donc je ne peux pas vous donner l'implémentation PHP mais le principe devrait être le même.
J'ai défini un type scalaire personnalisé appelé JSON qui renvoie simplement un objet JSON littéral.
L'implémentation de ruby était comme ça (en utilisant graphql-ruby)
Puis je l'ai utilisé pour nos objets comme ça
J'utiliserais cela avec parcimonie, en l'utilisant uniquement là où vous savez que vous avez toujours besoin de tout l'objet JSON (comme je l'ai fait dans mon cas). Sinon, cela va à l'encontre de l'objet de GraphQL plus généralement.
la source
{"en": "Hello", "es": "Hola"}
. Et comme chaque utilisateur peut implémenter son propre sous-ensemble de langues pour son cas d'utilisation, il n'est pas logique que l'interface utilisateur interroge tous les sous-ensembles possibles. Votre exemple fonctionne parfaitement.Le format de requête GraphQL a été conçu pour permettre:
Cependant, selon la documentation GraphQL , vous pouvez créer des fragments afin de rendre les jeux de sélection plus réutilisables:
Ensuite, vous pouvez interroger tous les détails de l'utilisateur en:
Vous pouvez également ajouter des champs supplémentaires à côté de votre fragment :
la source
Le package graphql-type-json prend en charge le type JSON de scalaires personnalisés. Utilisez-le pour afficher tout le champ de vos objets json. Voici le lien de l'exemple dans ApolloGraphql Server. https://www.apollographql.com/docs/apollo-server/schema/scalars-enums/#custom-scalars
la source