我正在调查在React.js客户端应用程序和服务器应用程序之间使用GraphQL的可能性,该应用程序构建在关系SQL数据库之上。应在客户端创建查询,包括复杂的SQL样式语句,如:
WHERE Customer.Age BETWEEN 22 AND 25
AND Order.Status = 'Active'
OR Product.Name LIKE '%foo%'
这意味着客户端通常应该只接收一小部分记录(例如10而不是10M)。
这个看起来很好的Phil Sturgeon article宣称奇怪的事情:
我希望GraphQL可以帮助客户定义自己的范围,过滤这些包括成为适当的数据本身,这将有助于识别作为便利方法的API应添加的范围。
看起来GraphQL在这个例子中对API开发人员没有帮助,但似乎有人说将来添加@filter来做这件事。
在将来?现在没有在GraphQL中过滤?我继续研究并找到了this SO question和这个amazing interactive Graphcool documentation。这两个示例都使用了一个名为filter
的功能,其中包含一组后缀,如_gte
:
query combineMovies {
allMovies(filter: {
OR: [{
AND: [{
releaseDate_gte: "2009"
}, {
title_starts_with: "The Dark Knight"
}]
}, {
title: "Inception"
}]
}) {
title
releaseDate
}
}
但是,filter
没有关于http://graphql.org关键字的规范。我甚至检查了Relay文档并找不到复杂过滤的好例子(也许是因为我没有React经验)。
请说明GraphQL构建复杂的SQL WHERE类查询的能力。它是标准的一部分还是只是弱支持的侧面功能?
我继续研究,发现了这个问题和这个amazing interactive Graphcool documentation。
感谢您的客气话!我是这篇文章的作者,很高兴它有用!让我从Graphcool API的角度回答您的问题。
GraphQL查询使用字段构建。这里我们使用id
字段定义的allMovies
字段:
query allMovies {
allMovies {
id
}
}
我建议阅读this article以获取有关GraphQL查询的术语的更多信息。
GraphQL定义了所谓的query arguments,可以附加到字段。这些参数编码GraphQL Server的附加信息,并影响字段的解析方式。一个常见的例子是first
查询参数:
query firstMovie {
allMovies(first: 1) {
id
}
}
让我们进一步调查!
query darkKnightMovies {
allMovies(filter: {
title_contains: "Dark Knight"
}) {
id
}
}
在上面的查询中,filter
是allMovies
字段的参数。其语法方面在GraphQL规范中定义,如上所示。但是,GraphQL没有指定此参数如何改变allMovies
字段的解析。这仅由GraphQL后端中allMovies
字段的解析程序的更改行为决定。
GraphQL提供了支持服务器端过滤的所有必要概念(查询,字段,参数)。但是,使用这些概念来编码特定行为(如过滤)取决于创建GraphQL API的开发人员。
Graphql是一个规范,有不同的客户端和服务器实现,如Apollo,Graphcool,Relay。您在问题中粘贴的代码是客户端查询,它有点复杂。在我看来,它比查询本身更接近查询构建器。
Graphql查询可以是您想要的简单或复杂,完全取决于您假设您正在编写自己的服务器。
您可以将简单的键值对发送到服务器,并在服务器端的解析器函数中构建数据库查询,并将查询提供给数据库以获取数据。或者,您可以在客户端构建格式良好的查询,并直接将这些查询提供给解析器函数中的数据库,甚至不用触摸它。我认为graqhcool选择第二种方法。
所以基本上涉及三个步骤:
规范可能不会谈论过滤,因为它是实现细节(它只是您在帖子请求中使用的参数名称),尽管它确实如此,只是阅读分页部分。
对于启动器,规范可能有点抽象,因此从像Apollo Server这样的实现服务器开始可能是更好的方法和更简单的学习graphql的方法。