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

Posted

技术标签:

【中文标题】你如何在 GraphQL 中处理多个类型的数组(例如:不同的内容块)?【英文标题】:How do you handle an array of multiple types (ex: different content blocks) in GraphQL? 【发布时间】:2019-02-04 21:01:25 【问题描述】:

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

视频 报价 广告

等等……

根据我的阅读,不鼓励在数组中包含多种类型。

但是在这种情况下,你还应该怎么做呢?

有没有办法在 GraphQL 中处理这个问题?

有没有更好的方法来构建数据?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

联合模式示例:

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

【讨论】:

以上是关于你如何在 GraphQL 中处理多个类型的数组(例如:不同的内容块)?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 REST API 定义多个或嵌套 json 数据的数组类型

如何使用 Prisma 和 GraphQL 创建自解析对象类型数组

如何在类型定义中为 GraphQL 字段定义数组数据类型

如何将对象列表或数组传递到旨在更新单个对象的 GraphQL 突变中?

如何使用 Graphql 从 Strapi 查询 Gatsby 中的多个图像

如何将具有多个对象的状态数组作为参数传递给graphql突变?