2017-04-17 67 views
1

我正在研究在React.js客户端应用程序和构建于关系SQL数据库之上的服务器应用程序之间使用GraphQL的可能性。查询应该在客户端创建,包括复杂的SQL风格的语句,如:GraphQL是否支持服务器端过滤(即在客户端建立WHERE-like查询)?

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 
    } 
} 

然而,在http://graphql.orgfilter关键字不规范。 我甚至检查了Relay文档,发现没有复杂过滤的好例子(也许是因为我没有React经验)。

请阐明GraphQL的能力来构建复杂的SQL WHERE-like查询。它是标准的一部分还是仅仅是一个弱支持的特征?

回答

4

我继续研究,发现了这个SO问题,并且这个amazing interactive Graphcool documentation

感谢您的好评!我是这篇文章的作者,很高兴这有帮助!让我从Graphcool API的角度回答你的问题。

GraphQL查询和字段

GraphQL查询是使用字段构建的。这里我们使用的allMovies字段定义的id领域:

query allMovies { 
    allMovies { 
    id 
    } 
} 

我建议对周围GraphQL查询术语的详细信息读取this article

查询参数

GraphQL定义所谓query arguments可以附着到字段。这些参数为GraphQL服务器编码附加信息并影响该字段将如何解析。一个常见的例子是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的开发人员。

相关问题