在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 无法处理的循环依赖项。
所提供的文章展示了一种具有有限递归深度的方法。
- 解决方法是仅获取
code
或 itemName
等标识,并在需要时重新获取这些对象。
- 如果需要整个结构作为一个对象,您可以考虑将结构作为 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.
我有以下方案
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 无法处理的循环依赖项。 所提供的文章展示了一种具有有限递归深度的方法。
- 解决方法是仅获取
code
或itemName
等标识,并在需要时重新获取这些对象。 - 如果需要整个结构作为一个对象,您可以考虑将结构作为 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.