首页 > 解决方案 > 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
  }
}

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

标签: graphqlgraphql-js

解决方案


我同意@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
}

推荐阅读