首页 > 解决方案 > GraphQL如何查询多态关系?

问题描述

假设我有一个“爸爸”实体,它可能引用一个“儿子”或“女儿”实体。

我想构建一个图形 ql 查询,它将获取爸爸的名字 + 孩子的名字(儿子或女儿)

Dad
 |_Son
or
 |_Daughter

我发现使用片段可能是一种方法:

{
  DadCollection {
    items {
      name
      child {
        __typename
        ...Son{
          name
        }
        ...Daughter{
          name
        }
      }
    }
  }
}

只是想知道是否有更优雅的方式来执行上述查询避免代码冗余,或者是否有更好的方式来获取信息

另外......这是graphQL的一般行为还是由于这个特定的graphQL模式服务器实例是如何配置来检索数据的?

标签: graphqlrelationship

解决方案


这归结为单个模式。

GraphQL 有两种抽象类型——接口和联合。一个字段可能返回一个抽象类型,但该类型必须始终在运行时解析为对象类型。联合和接口在功能上是相同的,除了两个不同之处: 1) 联合显式定义它们可能的类型,而类型必须显式实现接口;2) 接口定义了所有实现类型必须具有的一组公共字段。

后一个区别的含义是,在查询接口字段时,您不必使用片段来指定可能的类型*当查询共享字段时**。换句话说,联合字段上的查询看起来像这样:

query {
  someUnion {
    # no fields allowed outside fragments
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}

对接口字段的查询可能如下所示:

query {
  someInterface {
    aCommonField
    anotherCommonField
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}

但是,需要注意的是,仅仅因为两种类型共享一个字段,并且两种类型都实现了一个接口,并不一定意味着该字段是接口上的一个字段。像上面这样的查询仅仅让字段很常见是不够的——它们必须明确地成为接口定义的一部分。

因此,您是否实际上可以避免name为每个内联片段键入取决于 1) 字段是否是接口,以及 2) 相关字段是否是接口定义的一部分。


推荐阅读