在父级上使用嵌套查询参数或在嵌套查询上使用父查询参数的graphql

时间:2018-12-07 08:25:56

标签: graphql graphql-js

我有产品和物品

产品:

{
  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参数发送到项目解析器?我唯一知道的方法是通过上下文,但是我发现这一点的地方是他们说这不是一个好主意,因为上下文遍及所有深度。

3 个答案:

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