联合内的 GraphQL 联合

Posted

技术标签:

【中文标题】联合内的 GraphQL 联合【英文标题】:GraphQL Union within Union 【发布时间】: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",
  

这可能吗?

【问题讨论】:

【参考方案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 接口或联合,并将其用作不同字段的返回类型。

【讨论】:

以上是关于联合内的 GraphQL 联合的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 联合和输入类型?

了解 GraphQL 联合类型

graphql,联合标量类型?

无法在 GraphQL 中实现联合

GraphQL 缝合和联合

联合类型导致 graphql 订阅