@AndrewRusinas

Как получать рекурсивно вложенные элементы в GraphQL?

Суть простая. Есть задачи, у них есть поле subtasks.

Через REST всё делалось просто - получение задач с parent: null, затем рекурсивный поиск вложенных задач.

Сейчас graphql только осваиваю, поэтому пока такие простые вещи кажутся непонятными и запутанными, буду признателен за помощь :)

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

То есть примерно так:
tasks {
_id
name
status
children {
    _id
    name
    status
    children { // повторить ∞ раз }
}
}
  • Вопрос задан
  • 308 просмотров
Решения вопроса 1
Negezor
@Negezor
Senior Shaurma Developer
В GraphQL на текущий момент невозможно сделать рекурсивное дерево через вложения, даже если мы будет повторять вложения, она в любом случае будет иметь конечное количество элементов, не говоря уже про размер самого запроса (не ответа). Однако всё не так плохо как может показаться, есть решения для этой проблемы:

1. Возвращать плоский массив элементов, соответственно на клиенте можем собрать дерево.
tasks {
_id
name
status
children {
    _id
    parentId
    name
    status
}

2. Использовать кастомный скаляр, например JSON. Однако в данном случае мы теряем типизацию схемы, в виду того что в скаляре может находится что угодно.
3. Сделать резолвер, который будет фильтровать элементы по ID их родителя. Однако в данном случае, сервер будет получать много запросов, так как в дереве может находится много элементов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы