Используйте GraphQL для извлечения объекта, который содержит массив объектов с различными схемами - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь написать запрос для получения объекта со свойством linkedCards, которое содержит массив объектов с различными схемами.

У меня есть 3 различные схемы (встроенные Содержательные ):

Пример CardA:

{
    id: 42,
    productName: 'Laptop',
    price: 999
}

Пример CardB:

{
    id: 999,
    title: 'Buy our refurbished Laptops today!'
}

Пример CardC:

{
    id: 100,
    linkedCards: [
        {
            id: 42,
            productName: 'Laptop',
            price: 999
        },
        {
            id: 999,
            title: 'Buy our refurbished Laptops today!'
        }
    ]
}

Запрос:

allCardC() {
    nodes {
        linkedCards {
            id
            title
        }
    }
}

Когда я пытаюсь выполнить следующий запрос GraphQL, я получаю "Cannot query field "title" on type "CardACardBUnion". Did you mean to use an inline fragment on "CardA" or "CardB"?"

Есть ли встроенный способ сделать это или я могу использовать идентификаторы CardA & CardBкаким-то образом?Возможно, есть один запрос для получения идентификаторов карт в linkedCards и другой запрос для получения указанных карт?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Может оказаться полезным использовать интерфейс GraphQL для указания полей, общих для каждого типа карт.

interface Card {
  id: ID!
}
# type CardA implements Card { ... }
type CardB implements Card {
  id: ID!
  title: String!
}
type CardC implements Card {
  id: ID!
  linkedCards: [Card!]!
}

Поскольку ответ @ DanielRearden предполагает, что вам все еще нужно использовать (встроенные) фрагменты для выбора полей, относящихся к одному из типов карт, но теперь, когда вы знаете, что каждая карта имеет поле id, вы можете выбрать это непосредственно.

allCardC {
    nodes {
        linkedCards {
            id
            ... on CardB { title }
        }
    }
}
2 голосов
/ 16 апреля 2019

Как показывает ошибка, вам нужно использовать встроенный фрагмент при запросе поля, которое разрешается в объединение:

allCardC {
    nodes {
        linkedCards {
            ... on CardA {
              id
              productName
              price
            }
            ... on CardB {
              id
              title
            }
        }
    }
}

Фрагменты могут быть определены внутри набора выбора. Это делается для условного включения полей в зависимости от их типа во время выполнения.

В отличие от интерфейсов или обычных типов объектов, объединения не указывают какие-либо конкретные поля, только типы, которые составляют объединение. Это означает, что набор выбора для поля, которое возвращает объединение, всегда должен использовать фрагменты для условного указания полей в зависимости от фактического типа, к которому относится поле.

Это все равно, что сказать: «если это фактический тип возвращаемого объекта, запросить эти поля».

...