GraphQL, как сделать запрос JOIN вместо многих последовательных запросов? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть два типа GraphQL:

type Author {
  id: String!
  name: String!
}

type Book {
  id: String!
  author: Author!
  name: String!
}

В моей базе данных это реализовано с помощью внешнего ключа в таблице книг:

авторов таблицы (псевдокод)

`id` INTEGER UNSIGNED
`name` STRING

таблицы книг (псевдокод)

`id` INTEGER UNSIGNED
`author_id` INTEGER UNSIGNED REFERENCE `authors.id`
`name` STRING

Поэтому, когда я разрешаю запрос GraphQL, например:

query allTheBooks {
  id
  name
  author {
    id
    name
  }
}

Я бы хотел выполнить только один SELECT запрос SQLнапример:

SELECT books.id, books.name, authors.id, authors.name
FROM books
LEFT JOIN authors ON authors.id = books.author_id

Вместо текущего:

SELECT books.id, books.name, books.author_id
FROM books

SELECT authors.id, authors.name
FROM authors
WHERE author.id = [one the the books.author_id of the first SELECT]

SELECT authors.id, authors.name
FROM authors
WHERE author.id = [one the the books.author_id of the first SELECT]

[...]

Есть ли способ узнать, какие "дочерние поля" запрашиваются в распознавателе GraphQL?

Заранее спасибо за ответ!

1 Ответ

0 голосов
/ 27 мая 2018

Я только что обнаружил, что в четвертом параметре GiveD в резольвере, там, где находится массив запрашиваемых полей: info.fieldNodes[0].selectionSet.selections.

Я не нашел никакой документации по этому поводу, и мне интересно, что представляютмассив fieldNodes ... (и не хотел бы обращаться к первому элементу таким образом, не зная его ...).

Объект selections содержит массив, подобный следующему:

[
  {
    kind: 'Field',
    alias: undefined,
    name: { kind: 'Name', value: 'id', loc: [Object] },
    arguments: [],
    directives: [],
    selectionSet: undefined,
    loc: { start: 36, end: 38 }
  },
  {
    [...]
  },
  ...
]

Здесь value: 'id' соответствует имени запрашиваемого поля соответствующего автора.

Если я углублюсь в уровень, selectionSet: undefined станет объектом, и шаблон повторяется рекурсивно ...

...