GraphQL, как запросить отношение полиморф c? - PullRequest
0 голосов
/ 28 февраля 2020

Допустим, у меня есть сущность "папа", которая может ссылаться на одну сущность "сын" или "дочь".

Я хочу построить запрос ql графа, который получит имя папы + имя ребенка ( Сын или дочь)

Dad
 |_Son
or
 |_Daughter

Я понял, что использование фрагментов может быть способом go:

{
  DadCollection {
    items {
      name
      child {
        __typename
        ...Son{
          name
        }
        ...Daughter{
          name
        }
      }
    }
  }
}

Просто удивляйтесь, есть ли более элегантный способ выполнения Вышеупомянутый запрос, избегающий избыточности кода, или, если есть просто лучший способ получить информацию

Кроме того ... Это поведение для GraphQL в целом или из-за того, как это специфицирует c экземпляр сервера схемы GraphQL был настроен для получения данных?

1 Ответ

1 голос
/ 28 февраля 2020

Это сводит отдельные схемы.

В GraphQL есть два абстрактных типа - интерфейсы и объединения. Поле может возвращать абстрактный тип, но этот тип всегда должен преобразовываться в тип объекта во время выполнения. Объединения и интерфейсы функционально одинаковы, за исключением двух отличий: 1) объединения явно определяют свои возможные типы, в то время как типы должны явно реализовывать интерфейс; и 2) интерфейсы определяют набор общих полей, которые должны иметь все реализующие типы.

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

query {
  someUnion {
    # no fields allowed outside fragments
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}

запрос к полю интерфейса может выглядеть так:

query {
  someInterface {
    aCommonField
    anotherCommonField
    ... on Foo {
      foo
    }
    ... on Bar {
      bar
    }
  }
}

Однако важно отметить, что если два типа совместно используют поле, а оба типа реализуют интерфейс, это не обязательно означает, что поле является полем интерфейса. Недостаточно, чтобы поля были общими для выполнения запроса, подобного описанному выше - они должны явно являться частью определения интерфейса.

Так что, действительно ли вы можете избежать ввода name для каждого встроенного фрагмента, зависит о том, является ли 1) поле интерфейсом и 2) рассматриваемое поле является частью определения интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...