Bri*_*ink 7 graphql graphql-js
我有一个产品和项目
产品:
{
id: Int
style_id: Int
items: [items]
}
Run Code Online (Sandbox Code Playgroud)
项目:
{
id: Int
product_id: Int
size: String
}
Run Code Online (Sandbox Code Playgroud)
我想查询产品,但只取回有尺寸的产品。
因此,查询可能如下所示:
products(size: ["S","M"]) {
id
style_id
items(size: ["S","M"]) {
id
size
}
}
Run Code Online (Sandbox Code Playgroud)
但似乎应该有一种方法可以让我做
products {
id
style_id
items(size: ["S","M"]) {
id
size
}
}
Run Code Online (Sandbox Code Playgroud)
在产品的解析器中,我可以从嵌套查询中获取参数并使用它们。在这种情况下,添加检查以仅返回具有这些尺寸的产品。通过这种方式,我返回了带有正确分页的顶层,而不是大量空产品。
这是可能的还是至少反过来做:
products(size: ["S","M"]) {
id
style_id
items {
id
size
}
}
Run Code Online (Sandbox Code Playgroud)
并将大小参数发送到项目解析器?我知道的唯一方法是通过上下文,但在我发现的一个地方,他们说这不是一个好主意,因为上下文涵盖了所有深度的完整查询。
我同意@DenisCappelini 的回答。如果可能,您可以创建一个新类型,该类型仅表示具有项目的产品。
但是,如果您不想这样做,或者您只是对顶级选择器如何了解子选择器上的参数感兴趣,这里有一种方法:
有 2 种方法可以做到。
去做这个:
products {
id
style_id
items(size: ["S","M"]) {
id
size
}
}
Run Code Online (Sandbox Code Playgroud)
在 graphql 中,解析器具有以下签名:
(obj, args, context, info) => {}
Run Code Online (Sandbox Code Playgroud)
第四个参数 ,info
包含有关整个请求的信息。也就是说,它知道子选择器上的参数。
使用这个包,或者一个类似的包,因为还有其他包,为你解析信息:https : //www.npmjs.com/package/graphql-parse-resolve-info
以上是相当多的工作,所以如果你想这样做:
products(size: ["S","M"]) {
id
style_id
items {
id
size
}
}
Run Code Online (Sandbox Code Playgroud)
然后在您的解析器 for 中products
,您还需要返回size
. 假设这是您的解析器products
:
(parent, args) => {
...
return {
id: '',
style_id: ''
}
}
Run Code Online (Sandbox Code Playgroud)
修改您的解析器以返回如下大小:
(parent, args) => {
...
return {
id: '',
style_id: '',
size: ["S", "M"]
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在您的 解决方案中products.items
,您将可以访问size
,如下所示:
(product, args) => {
const size = product.size
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11594 次 |
最近记录: |