【问题标题】:GraphQL Union within Union联合内的 GraphQL 联合
【发布时间】:2019-07-02 03:28:46
【问题描述】:

下面是一个概念上我正在寻找的查询。但是,我不知道如何实现......或者即使它是可能的。

query getMedia($id: ID!) {
  media(id: $id) {
    __typename
    title

    ... on Movie {
      fps
    }

    ... on Music {
      duration

      ... on Song {
        lyrics
      }

      ... on Composition {
        movements
      }
    }

  }

基本上,我有媒体类型,如果是音乐,则有不同类型的音乐。如果记录是“歌曲”,我希望这是响应:

{
  "media": {
    "__typename": "Song",
    "duration": 5.67,
    "title": "Some Song",
    "lyrics": "La de da de da de da de day oh",
  }
}

这可能吗?

【问题讨论】:

    标签: graphql graphql-tag


    【解决方案1】:

    需要明确的是,您的问题中出现的 media 字段必须是接口,而不是联合,因为它至少包含一个所有实现类型共有的字段 (title)。无论如何,无论我们谈论的是接口还是联合,都不支持您建议的那种语法。只有对象类型可以实现接口。 Similarly:

    Union 类型的成员类型必须都是 Object 基类型;标量、接口和联合类型不能是联合的成员类型。同样,包装类型也不能是 Union 的成员类型。

    MovieSongComposition都需要扩展Media接口,然后就可以这样查询了:

    query getMedia($id: ID!) {
      media(id: $id) {
        __typename
        title
    
        ... on Movie {
          fps
        }
    
        ... on Song {
          duration
          lyrics
        }
    
        ... on Composition {
          duration
          movements
        }
      }
    }
    

    不幸的是,这确实意味着您的内联片段中有一些重复。好消息是,对象类型可以 implement multiple interfaces,并且实现接口并不排除它被包含在一个或多个联合中。因此,如果您需要它,您仍然可以创建一个 Music 接口或联合,并将其用作不同字段的返回类型。

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 2020-04-11
      • 2018-09-28
      • 2019-07-01
      • 2021-09-01
      • 2021-07-25
      • 2017-12-30
      • 2018-03-28
      相关资源
      最近更新 更多