在graphql中查询循环属性

Query circular attribute in graphql

我有以下方案

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 {
                    ....
                  }
                }
            }
        }
     }
  }
`
              

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

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

GraphQL 支持任意深度的“循环”嵌套 parent-child 查询。 GraphQL 递归解析字段,stopping when all field values resolve to scalars.

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

这里有一个 runnable example using the "circular" character-film relation in the Star Wars API. The query terminates when there are no more 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
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

查询必须根据深度动态写入客户端。您可以有另一个查询字段 returns this.