【问题标题】:Query circular attribute in graphql在graphql中查询循环属性
【发布时间】:2022-02-07 22:30:53
【问题描述】:

我有以下方案

type Product {
   code: ID!
   services: [ServiceGroup]
}

type ServiceGroup {
   code: String!
   options: [ServiceItem]
}

type ServiceItem {
   itemName: String!
   groups: [ServiceGroup]
}

现在在客户端,考虑到groups 嵌套了更多组,我如何查询产品及其服务。

gql`
 query getProduct($code: ID!) { 
     product(code: $code) {
        code
        services {
           code
           options {
               itemName
               groups {
                  code
                  options {
                    ....
                  }
                }
            }
        }
     }
  }
`
              

【问题讨论】:

  • 嵌套导致的问题是什么?
  • 问题是如何查询无限嵌套的组属性?
  • GraphQL 简单地支持任意深度的“循环”嵌套父子查询。这通常被认为是一个特性,而不是一个错误。您的问题是如何编写在所需深度“停止”的查询?
  • 是的,基本上我怎么能写一个查询,直到没有更多的数据。

标签: graphql react-apollo


【解决方案1】:

GraphQL 微不足道地支持任意深度的“循环”嵌套父子查询。 GraphQL 递归解析字段,stopping when all field values resolve to scalars

在您的示例中,如果您删除了options {....},查询将终止,因为code 是一个标量。停止的正确位置取决于您的用例。

这是一个runnable example,使用星球大战 API 中的“循环”角色-电影关系。当没有更多 Object Type 字段要解析时,查询将终止。这个愚蠢的例子过度嵌套:结果很快变得重复。不过,重复嵌套有其用途。它可以重塑结果集,例如将parents > children 结构反转为children > parents

query AllFilms($f:Int) {
  allFilms(first:$f) {
    films {
      title
      characterConnection(first: $f) {
        characters {
          name
          filmConnection {
            films {
              title
              characterConnection {
                characters {
                  name
                  filmConnection {
                    films {
                      title
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    问题是gql不允许nesting of recursive fragments。在提供的示例中,您有一个 gql 无法处理的循环依赖项。 提供的文章展示了一种具有有限递归深度的方法。

    • 解决方法是仅获取 codeitemName 等标识,并在需要时重新获取这些对象。
    • 如果需要将整个结构作为一个对象,您可以考虑将该结构作为 JSON 对象(编码为 String)获取并在本地解析它。 使用这种方法不是类型安全的!

    【讨论】:

      【解决方案3】:

      必须根据深度在客户端中动态编写查询。你可以有另一个查询字段来返回这个。

      【讨论】:

        猜你喜欢
        • 2020-03-15
        • 2020-11-17
        • 1970-01-01
        • 2021-07-18
        • 2019-02-14
        • 2019-10-22
        • 2019-08-28
        • 2013-03-11
        • 2018-10-02
        相关资源
        最近更新 更多