graphql 在嵌套查询的父或父参数上使用嵌套查询参数
Posted
技术标签:
【中文标题】graphql 在嵌套查询的父或父参数上使用嵌套查询参数【英文标题】:graphql using nested query arguments on parent or parent arguments on nested query 【发布时间】:2019-05-08 23:56:29 【问题描述】:我有一个产品和项目
产品:
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
然后将 size 参数发送到项目解析器?我知道的唯一方法是通过上下文,但我发现的一个地方他们说这不是一个好主意,因为上下文跨越了所有深度的完整查询。
【问题讨论】:
尝试“项目:[项目!]!”在产品架构中。 GraphQL 本身并不支持您的要求;如果你想过滤你得到的***项目,它需要由***查询字段上的参数控制,而不是更低的。 @DavidMaze 这是不正确的。看我的回答。 【参考方案1】:我同意@DenisCappelini 的回答。如果可能,您可以创建一个新类型,它只表示具有项目的产品。
但是,如果您不想这样做,或者您只是对***选择器如何了解子选择器上的参数感兴趣,可以使用以下方法:
有两种方法。
为此:
products
id
style_id
items(size: ["S","M"])
id
size
在 graphql 中,解析器具有以下签名:
(obj, args, context, info) =>
第 4 个参数 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
【讨论】:
没有意识到您可以返回未在返回对象中设置的字段并将它们放在孩子身上。这是完全合理的,也是我将要去做的事情。info
解决方案很酷! IMO 第二个有点奇怪,但它应该也可以工作!【参考方案2】:
IMO 你应该有一个ProductFilterInputType
,它由GraphQLList(GraphQLString)
表示,这个解析器会根据这个列表过滤products
。
import GraphQLList, GraphQLString from 'graphql';
const ProductFilterInputType = new GraphQLInputObjectType(
name: 'ProductFilter',
fields: () => (
size:
type: GraphQLList(GraphQLString),
description: 'list of sizes',
),
);
希望对你有帮助:)
【讨论】:
【参考方案3】:我发现这很有用#reference
//the typedef:
type Post
_id: String
title: String
private: Boolean
author(username: String): Author
//the resolver:
Post:
author(post, username)
//response
,
// usage
posts(private: true)
_id,
title,
author(username: "theara")
_id,
username
【讨论】:
以上是关于graphql 在嵌套查询的父或父参数上使用嵌套查询参数的主要内容,如果未能解决你的问题,请参考以下文章
具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询