web-dev-qa-db-fra.com

Comment rechercher des valeurs de chaîne dans GraphQL

Comment interrogez-vous en utilisant GraphQL dans un manoir similaire à l'opérateur like de SQL?

Exemple: Quels utilisateurs ont un prénom commençant par jason?

select * from users where first_name like "jason%"

30
Jason

La réponse courte est: vous ne le faites pas.

La réponse la plus longue est que vous devez écrire ce code vous-même. GraphQL n'est pas un langage de requête de base de données comme SQL, c'est un langage de requête d'application. Cela signifie que GraphQL ne vous permettra pas d'écrire des requêtes arbitraires hors de la boîte. Il ne prendra en charge que les types de requêtes définis dans votre schéma GraphQL.

Si vous voulez pouvoir écrire une requête contenant like, vous devez

a) déclarer que dans le schéma, et b) écrire une fonction de résolution qui récupère les données

Par exemple, vous pourriez avoir ce schéma:

type Query {
  users(firstName: String!): [User]
}

type User {
  firstName: String
  lastName: String
}

Vous devez définir la fonction de résolution suivante pour le champ users:

{
  Query: {
    users(root, args){
      return sql.raw('SELECT * FROM `users` WHERE `firstName` LIKE ?', args.firstName);
    }
  }
}

Et enfin, écrivez cette requête pour obtenir une liste de firstName et lastName de tous les utilisateurs qui correspondent à vos critères de recherche:

{
  users(firstName: 'jason%'){
    firstName
    lastName
  }
} 

Voici un article que j'ai écrit il y a quelque temps qui clarifie certains des concepts autour de GraphQL: https://medium.com/apollo-stack/how-do-i-graphql-2fcabfc94a01

Et voici un article qui explique l'interaction entre les schémas GraphQL et les fonctions de résolution: https://medium.com/apollo-stack/graphql-explained-5844742f195e

46
helfer

Je ne sais pas si cela vous concerne parce que vous voulez qu'il commence par "jason" (c'est-à-dire qu'il renvoie "jason bourne" mais pas "bourne jason") mais j'ai récemment trouvé un moyen d'interroger GraphQL dans un "% Like%" manière. Pour votre cas d'utilisation, cela ressemblerait à ceci:

export const allUsersQuery = `
  query allUsers($UserName: String!){
    allUsers(
      filter: {first_name_contains: $UserName}
    ) {
      id
      first_name
      ...INSERT_OTHER_FIELDS_HERE...
    }
  }
`;

FWIW: Je l'ai fait en utilisant un BAAS GraphCool. Je ne pense pas que vous utilisiez GraphCool parce que GraphCool n'autorise pas "_" dans les noms de variables.

J'espère que cela aide quelqu'un sur toute la ligne :)

5
Mark Miller