我有产品和物品
产品:
{
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参数发送到项目解析器?我唯一知道的方法是通过上下文,但是我发现这一点的地方是他们说这不是一个好主意,因为上下文遍及所有深度。
答案 0 :(得分:1)
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',
}
}),
});
希望它会有所帮助:)
答案 1 :(得分:1)
我同意@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
}
答案 2 :(得分:0)
我发现这很有用#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
}
}
}