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

Bri*_*ink 7 graphql graphql-js

我有一个产品和项目

产品:

{
  id: Int
  style_id: Int
  items: [items]
}
Run Code Online (Sandbox Code Playgroud)

项目:

{
  id: Int
  product_id: Int
  size: String
}
Run Code Online (Sandbox Code Playgroud)

我想查询产品,但只取回有尺寸的产品。

因此,查询可能如下所示:

products(size: ["S","M"]) {
  id
  style_id
  items(size: ["S","M"]) {
    id
    size
  }
}
Run Code Online (Sandbox Code Playgroud)

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

products {
  id
  style_id
  items(size: ["S","M"]) {
    id
    size
  }
}
Run Code Online (Sandbox Code Playgroud)

在产品的解析器中,我可以从嵌套查询中获取参数并使用它们。在这种情况下,添加检查以仅返回具有这些尺寸的产品。通过这种方式,我返回了带有正确分页的顶层,而不是大量空产品。

这是可能的还是至少反过来做:

products(size: ["S","M"]) {
  id
  style_id
  items {
    id
    size
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Cro*_*sby 5

我同意@DenisCappelini 的回答。如果可能,您可以创建一个新类型,该类型仅表示具有项目的产品。

但是,如果您不想这样做,或者您只是对顶级选择器如何了解子选择器上的参数感兴趣,这里有一种方法:

有 2 种方法可以做到。


去做这个:

products {
  id
  style_id
  items(size: ["S","M"]) {
    id
    size
  }
}
Run Code Online (Sandbox Code Playgroud)

在 graphql 中,解析器具有以下签名:

(obj, args, context, info) => {}
Run Code Online (Sandbox Code Playgroud)

第四个参数 ,info包含有关整个请求的信息。也就是说,它知道子选择器上的参数。

使用这个包,或者一个类似的包,因为还有其他包,为你解析信息:https : //www.npmjs.com/package/graphql-parse-resolve-info


以上是相当多的工作,所以如果你想这样做:

products(size: ["S","M"]) {
  id
  style_id
  items {
    id
    size
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的解析器 for 中products,您还需要返回size. 假设这是您的解析器products

(parent, args) => {
  ...
  return {
    id: '',
    style_id: ''
  }
}
Run Code Online (Sandbox Code Playgroud)

修改您的解析器以返回如下大小:

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

现在,在您的 解决方案中products.items,您将可以访问size,如下所示:

(product, args) => {
  const size = product.size
}
Run Code Online (Sandbox Code Playgroud)

  • 没有意识到您可以返回未在返回对象中设置的字段并将它们放在子对象上。这非常有道理,也是我将采取的方式。 (2认同)