我正在研究在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(文章宣布了奇怪的事情:
我希望GraphQl可以帮助客户定义自己的范围, 过滤这些包括是适当的数据本身, 将有助于识别范围包括API,应添加为 便利方法。
在这种情况下,GraphQl似乎没有帮助API开发人员 但是似乎确实有关于添加@filter在 未来。
将来?现在没有过滤GraphQL?我继续研究,发现了这个问题和惊人的互动式GraphCool文档。这两个示例都使用称为filter
的功能,其中包含一组 _gte
的后缀:
query combineMovies {
allMovies(filter: {
OR: [{
AND: [{
releaseDate_gte: "2009"
}, {
title_starts_with: "The Dark Knight"
}]
}, {
title: "Inception"
}]
}) {
title
releaseDate
}
}
但是,在http://graphql.org上没有filter
关键字的规范。我什至检查了继电器文档,并且没有发现复杂过滤的好例子(也许是因为我没有反应经验(。
请阐明GraphQl构建复杂SQL的能力,其中类似于查询。它是标准的一部分还是仅是弱支持的侧面功能?
我继续进行研究,并发现了这个问题和惊人的互动GraphCool文档。
感谢您的客气话!我是本文的作者,很高兴它很有帮助!让我从GraphCool API的角度回答您的问题。
GraphQl查询和字段
GraphQl查询是使用字段构建的。在这里,我们使用allMovies
字段上定义的id
字段:
query allMovies {
allMovies {
id
}
}
我建议阅读本文以获取有关GraphQl查询的术语的更多信息。
查询参数
GraphQl定义了可以将其附加到字段的所谓查询参数。这些参数编码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服务器(例如Apollo Server(开始的实现服务器可能是更好的方法,并且可以更轻松地学习GraphQl。