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

Posted

技术标签:

【中文标题】graphql 在嵌套查询的父或父参数上使用嵌套查询参数【英文标题】:graphql using nested query arguments on parent or parent arguments on nested query 【发布时间】:2019-05-08 23:56:29 【问题描述】:

我有一个产品和项目

产品:


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

【问题讨论】:

尝试“项目:[项目!]!”在产品架构中。 GraphQL 本身并不支持您的要求;如果你想过滤你得到的***项目,它需要由***查询字段上的参数控制,而不是更低的。 @DavidMaze 这是不正确的。看我的回答。 【参考方案1】:

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

但是,如果您不想这样做,或者您只是对***选择器如何了解子选择器上的参数感兴趣,可以使用以下方法:

有两种方法。


为此:

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 的解析器中,您还需要返回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

【讨论】:

没有意识到您可以返回未在返回对象中设置的字段并将它们放在孩子身上。这是完全合理的,也是我将要去做的事情。 info 解决方案很酷! IMO 第二个有点奇怪,但它应该也可以工作!【参考方案2】:

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

希望对你有帮助:)

【讨论】:

【参考方案3】:

我发现这很有用#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
    
  

【讨论】:

以上是关于graphql 在嵌套查询的父或父参数上使用嵌套查询参数的主要内容,如果未能解决你的问题,请参考以下文章

具有多个嵌套解析器并将字段映射到参数的 GraphQL 查询

为什么无法在graphql中过滤深层嵌套查询?

Apollo GraphQL 中带有变量的嵌套查询

在嵌套属性上使用 useResult 选择 graphql 数据

type-Graphql 中的嵌套查询和变异

嵌套资源上的 GraphQL 突变