graphql - graphql 在嵌套查询的父或父参数上使用嵌套查询参数
问题描述
我有一个产品和项目
产品:
{
id: Int
style_id: Int
items: [items]
}
项目:
{
id: Int
product_id: Int
size: String
}
我想查询产品,但只取回具有尺寸的产品。
所以查询可能如下所示:
products(size: ["S","M"]) {
id
style_id
items(size: ["S","M"]) {
id
size
}
}
但似乎应该有一种方法可以让我做
products {
id
style_id
items(size: ["S","M"]) {
id
size
}
}
在产品的解析器中,我可以从嵌套查询中获取参数并使用它们。在这种情况下,添加检查以仅退回具有这些尺寸的产品。这样我就可以正确返回顶级页面,而不是很多空产品。
这是否可能或至少以相反的方式进行:
products(size: ["S","M"]) {
id
style_id
items {
id
size
}
}
并将大小参数发送到项目解析器?我知道的唯一方法是通过上下文,但我发现的一个地方他们说这不是一个好主意,因为上下文跨越了所有深度的完整查询。
解决方案
我同意@DenisCappelini 的回答。如果可能,您可以创建一个新类型,它只表示具有项目的产品。
但是,如果您不想这样做,或者您只是对顶级选择器如何了解子选择器上的参数感兴趣,这里有一种方法:
有两种方法可以做到这一点。
去做这个:
products {
id
style_id
items(size: ["S","M"]) {
id
size
}
}
在 graphql 中,解析器具有以下签名:
(obj, args, context, info) => {}
第四个参数 ,info
包含有关整个请求的信息。也就是说,它知道子选择器上的参数。
使用此包或类似的包,因为还有其他包为您解析信息:https ://www.npmjs.com/package/graphql-parse-resolve-info
上面的工作量很大,所以如果你想这样做:
products(size: ["S","M"]) {
id
style_id
items {
id
size
}
}
然后在您的解析器中products
,您还需要返回size
。假设这是您的解析器products
:
(parent, args) => {
...
return {
id: '',
style_id: ''
}
}
修改您的解析器以返回大小,如下所示:
(parent, args) => {
...
return {
id: '',
style_id: '',
size: ["S", "M"]
}
}
现在,在您的解决方案中products.items
,您将可以访问size
,如下所示:
(product, args) => {
const size = product.size
}
推荐阅读
- python - 在嵌套循环中使用 dask 进行循环并行化
- python - 将图像旋转 90 度
- swift - Swift 的模糊匹配算法
- swift - Swift 错误:无法打开文件“Dicee-iOS13”,因为您无权查看它
- reactjs - React Hooks:如何正确设置 useEffect 来处理表单中字段状态的更改?
- android - Why music won't play on Chrome for Android?
- c++ - 函数调用中会发生左值到右值的转换吗?
- excel - VBA 触发工作表更改与复制/粘贴
- c# - 不确定如何在 C# 中访问嵌套的 XML
- java - 不四舍五入的 Spark 格式数字