如何在GraphQL中处理多种类型的数组(例如,不同的内容块)?

时间:2018-08-30 01:49:05

标签: graphql contentful

假设我有一个页面构建器字段,其中引用了许多不同类型的内容块。

  • 视频
  • 报价
  • 广告

等...

根据我的阅读,不建议在数组中具有多种类型。

但是在这种情况下您还应该做什么?

是否可以在GraphQL中处理此问题?

是否有更好的数据结构方式?

2 个答案:

答案 0 :(得分:1)

您可以将它们定义为联合(如果所有实现类型都共享公共字段,则可以定义为接口)

联盟架构示例:

type Query {
  blocks: [ ContentBlock! ]!
}

type Video {
  url: String!
}

type Quote {
  body: String!
  author: String
}

type Advertisement {
  src: String!
  backgroundColor: String
}


union ContentBlock = Video | Quote | Advertisement

接口架构示例:

type Query {
  blocks: [ ContentBlock! ]!
}

type Video implements ContentBlock {
  id: ID!
  url: String!
}

type Quote implements ContentBlock {
  id: ID!
  body: String!
  author: String
}

type Advertisement implements ContentBlock {
  id: ID!
  src: String!
  backgroundColor: String
}


interface ContentBlock {
  id: ID!
}

示例解析器:

{
  ContentBlock: {
    __resolveType (source) {
      if (source.url) return 'Video'
      if (source.src) return 'Advertisment'
      if (source.author || source.body) return 'Quote'
    }
  }
}

查询示例:

{
  blocks {
    ...on Video {
      url
    }
    ...on Quote {
      body
      author
    }
    ...on Advertisement {
      src
      backgroundColor
    }
  }
}

More reading on Unions and Interfaces in GraphQL

答案 1 :(得分:0)

我相信,您可以实现接口列表或联合列表(基于数据的性质以及是否存在重复的字段)。在该界面/工会中,您将实现所有这些类型(视频,报价,广告)。但是,它将适用于数据提取,但是接口或联合作为输入类型不可用。如果您想将其实现为输入类型,则需要为其使用例如JSON自定义标量https://github.com/taion/graphql-type-json

编辑:我并不认为接口内的列表中包含多种类型是不好的做法。您可以查看节点查询或在Github api https://developer.github.com/v4/query/

上进行搜索