Как вы обрабатываете массив нескольких типов (например, разные блоки контента) в GraphQL? - PullRequest
0 голосов
/ 30 августа 2018

Допустим, у меня есть поле компоновщика страниц, которое ссылается на множество различных типов блоков контента.

  • Видео
  • Цитата
  • Реклама

и т.д ...

Из того, что я прочитал, создание нескольких типов в массиве не рекомендуется.

Но что еще вы должны делать в таком случае?

Есть ли способ справиться с этим в GraphQL?

Есть ли лучший способ структурировать данные?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы можете определить их как объединение (или интерфейс, если все типы реализации имеют общие поля)

Пример схемы объединения:

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
    }
  }
}

Подробнее о союзах и интерфейсах в GraphQL

0 голосов
/ 30 августа 2018

Я считаю, что вы можете реализовать список интерфейсов или список объединений (в зависимости от характера данных и наличия повторяющихся полей). И в этом интерфейсе / объединении вы будете реализовывать все эти типы (видео, цитата, реклама). Однако это будет работать для извлечения данных, но интерфейсы или объединения не доступны в качестве типов ввода. Если вы хотите реализовать его как тип ввода, вам нужно будет использовать для этого, например, пользовательский скаляр JSON https://github.com/taion/graphql-type-json.

Edit: я не думаю, что наличие нескольких типов в списке в интерфейсе является плохой практикой. Вы можете посмотреть на запрос узлов или поиск на Github API https://developer.github.com/v4/query/

...