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

graphql using nested query arguments on parent or parent arguments on nested query

我有一个产品和物品

产品:

{
  id: Int
  style_id: Int
  items: [items]
}

项目:

{
  id: Int
  product_id: Int
  size: String
}

我想查询商品,但只能查询到商品尺寸为 size 的商品。

因此查询可能如下所示:

products(size: ["S","M"]) {
  id
  style_id
  items(size: ["S","M"]) {
    id
    size
  }
}

但似乎应该有一种方法可以做到

products {
  id
  style_id
  items(size: ["S","M"]) {
    id
    size
  }
}

在产品的解析器中,我可以从嵌套查询中获取参数并使用它们。在这种情况下,仅将检查添加到具有这些尺寸的 return 产品。这样我就得到了顶级 return 分页正确而不是很多空产品。

这是否可能或至少反过来:

products(size: ["S","M"]) {
  id
  style_id
  items {
    id
    size
  }
}

并将大小参数发送到项目解析器?我知道的唯一方法是通过上下文,但我发现这个的一个地方他们说这不是一个好主意,因为上下文跨越所有深度的完整查询。

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',
    }
  }),
});

希望对您有所帮助:)

我同意@DenisCappelini 的回答。如果可能,您可以创建一个新类型,它仅表示具有 Item 的 Products。

但是,如果您不想这样做,或者您只是对顶级选择器如何了解子选择器的参数的一般情况感兴趣,可以通过以下方式实现:

有两种方法。


为此:

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 的解析器中,您还需要 return size。 假设这是 products:

的解析器
(parent, args) => {
  ...
  return {
    id: '',
    style_id: ''
  }
}

将您的解析器也修改为 return 大小,如下所示:

(parent, args) => {
  ...
  return {
    id: '',
    style_id: '',
    size: ["S", "M"]
  }
}

现在,在您决定 products.items 时,您将可以访问 size,如下所示:

(product, args) => {
  const size = product.size
}

我觉得这很有用#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
    }
  }
}