Я не пробовал (пока) в одном запросе, но это возможно.
Чтение документов, начиная с это
В начале я бы попробовал что-то вроде:
query fetchBooksOfUser($id: ID) {
person (id: $id) @rest(type: "Person", path: "api/person/{args.id}") {
name,
books @rest(type: "Book", path: "api/book/{data.person.books.id}") {
id,
title
}
}
}
... но, вероятно, это не сработает - возможно, он недостаточно умен для работы с массивами.
ОБНОВЛЕНИЕ: См. примечание для похожего примера, но с использованием одного общего разрешенного родителями параметра. В вашем случае мы частично разрешили books
как массивы объектов с id
. Я не знаю, как использовать эти ids
для разрешения пропущенных полей () на том же уровне дерева.
Другая возможность - сделать связанные подзапросы / подзапросы (как-нибудь) в Person
type patcher. Должно быть возможно.
Действительно ли это должен быть один запрос? Вы можете предоставить идентификаторы дочерним контейнерам, каждый из которых запускает собственный запрос при необходимости.
ОБНОВЛЕНИЕ: Apollo позаботится о пакетировании (Не для REST, не для всех серверов graphql - читайте docs ).
«это удобно» для создания одного запроса, но apollo кеширует его, нормализуя ответ по типам - данные будут храниться отдельно. Использование одного запроса удерживает вас в пределах overfetching camp
или template thinking
(соберите все возможные данные до одного шага рендеринга).
Ract thinking
сохраняет ваши данные и представление разложенными, используемыми при необходимости, более специализированными и т. Д.
<Person/>
Контейнер будет запрашивать данные, необходимые для визуализации, и список идентификаторов, необходимых для детей. Каждый <Book/>
будет запрашивать собственные данные, используя переданный id
.