GraphQL лучший способ фильтрации на основе родительского узла

Итак, клиенту нужен ответ с такой структурой

user
  |_ trophies <-- user earned trophies
        |_ trophy_count: Int <-- how many times a user earned a trophy

и моя схема выглядит так:

type User {
  trophies: [Trophy]
}
type Trophy{
  ...
  trophy_count # <- needs the user_id to work 
}

Можно ли иметь trophy_count в типе Trophy? Как я могу структурировать свою схему, чтобы получить вышеуказанный запрос?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
0
9
1

Ответы 1

Хороший способ

Вам нужен шрифт посередине.

type User {
  trophies: [UserTrophy]
}
type UserTrophy {
  trophy: Trophy
  trophy_count: Int
}
type Trophy{
  # only trophy related properties
}

Однако запрос клиента немного изменится.

User{
  trophies{
    trophy{
      ...
    }
    trophy_count
}

Плохие решения (чтобы избежать)

Если вы должны вернуться, следуя приведенной выше структуре ответа, то есть способы, но они менее удобны для обслуживания / чтения и могут вызвать проблемы, если запрос будет выполнен другим способом, чем вы ожидаете.

  1. Передайте user_id в качестве аргумента trophy_count (не будет работать при запросе многих пользователей)
User{
  trophies{
    ...
    trophy_count(user_id: ID) # <-- filter by user_id in the resolver
}

  1. Передайте user_id внукам и отфильтруйте с ним, если есть

в преобразователе трофеев

return {
  ...trophy,
  user_id: parent.id
};

в преобразователе trophy_count

if (typeof parent.user_id == 'undefined') throw new Error("Must be queried with user type");
// continue logic ...
  1. Никогда не передавать user_id в контексте? Выполнение запроса происходит горизонтально (все пользователи будут загружены до загрузки трофеев до загрузки trophy_count). Это означает, что пользователи переопределят контекст, и только последний user_id будет фактически передан распознавателю trophy_count ВСЕХ пользователей.

Не стесняйтесь предлагать любые другие решения.

Другие вопросы по теме