如何在GraphQL

时间:2016-06-23 02:19:52

标签: graphql

如何在类似于SQL的like运算符的庄园中使用GraphQL进行查询?

示例:哪些用户的名字以jason开头?

select * from users where first_name like "jason%"

2 个答案:

答案 0 :(得分:45)

简短的回答是:你没有。

答案越长,你必须自己编写代码。 GraphQL不是像SQL这样的数据库查询语言,它是一种应用程序查询语言。这意味着GraphQL不会让您直接编写任意查询。它只支持GraphQL架构中定义的查询类型。

如果您希望能够编写包含like的查询,则必须

a)在架构中声明,和 b)编写一个获取数据的解析函数

例如,您可以拥有此架构:

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

type User {
  firstName: String
  lastName: String
}

您必须为users字段定义以下解析函数:

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

最后编写此查询以获取符合搜索条件的所有用户的firstName和lastName列表:

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

这是我前一段时间写的一篇文章,阐明了GraphQL的一些概念:https://medium.com/apollo-stack/how-do-i-graphql-2fcabfc94a01

这是一篇解释GraphQL模式和解析函数之间相互作用的帖子:https://medium.com/apollo-stack/graphql-explained-5844742f195e

答案 1 :(得分:5)

不确定这是否与您相关,因为您希望它以" jason"开头。 (即将返回" jason bourne"但不会" bourne jason")但我最近遇到了一种方式来查询和#34;%Like%"方式。对于您的用例,它看起来像这样:

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

FWIW:我是使用GraphCool BAAS完成的。我不认为你使用的是GraphCool,因为GraphCool不允许" _"变量名。

希望这可以帮助某些人:)