GraphQL支持服务器端过滤(即在客户端构建类似查询的位置)



我正在研究在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
  }
}

在上述查询中,filterallMovies字段的参数。如上所述,在GraphQL规范中定义了其句法方面。但是,GraphQL并未指定该参数应如何更改allMovies字段的分辨率。这仅取决于GraphQl后端中allMovies字段的解析器的更改行为。

结论

GraphQl提供了所有必要的概念(查询,字段,参数(以支持服务器端过滤。但是,使用这些概念编码特定行为(例如过滤(取决于创建GraphQl API的开发人员。

GraphQl是一个规范,并且有不同的客户端和服务器实现,例如Apollo,GraphCool,Relay。您在问题中粘贴的代码是客户端查询,这有点复杂。在我看来,它比查询构建器比查询本身更接近查询构建器。

GraphQl查询可以像您想要的那样简单或复杂,完全由您决定您正在编写自己的服务器。

您可以将简单的键值对发送到服务器,并在服务器端的解析器函数中构建数据库查询,并将查询馈送到数据库中以获取数据。或者,您可以在客户端构建格式良好的查询,并直接将这些查询送到分辨率功能中的数据库中,而无需触摸它。我认为Graqhcool选择了第二种方法。

基本上涉及三个步骤:

  1. 客户端发送一些查询,基本上是带有序列化文本的获取或发布请求,
  2. 服务器上的解析器函数将其拾取并从数据库中获取请求的数据
  3. 并返回响应,因此解决了请求。

规范可能不会谈论过滤,因为它是实现细节(这只是您在发布请求中使用的参数名称(,尽管它确实可以阅读分页部分。

对于起动器,规范可能有点抽象,因此从例如Apollo服务器(例如Apollo Server(开始的实现服务器可能是更好的方法,并且可以更轻松地学习GraphQl。

最新更新