Преобразователь GraphQL для элемента типа, имеющего отношения «многие ко многим»

Я настраиваю сервер GraphQL Apollo и хочу определить преобразователь для типа объекта, в котором есть элемент, содержащий массив данных на основе отношения «многие ко многим».

У меня есть объект Measurement, который связан с объектом Activity отношением «многие ко многим»:

Measurement.belongsToMany(Activity, {
    as: 'activity',
    through: 'activity_measurement_entries',
    underscored: true
});
Activity.belongsToMany(Measurement, {
    as: 'measurements',
    through: 'activity_measurement_entries',
    underscored: true
});

Запрос распознавателя отлично работает для запроса getActivities, когда Measurement включен непосредственно в запрос, например:

getActivities: async (parent, args, { models }) => {
    const activities = await models.Activity.findAll({
        include: [{
            model: models.Measurement,
            as: 'measurements',
        }],
    });
    return activities;
},

Таблица activity_measurement создается автоматически через Sequelize, которая содержит activity_id и measurement_id.

Я хотел бы определить преобразователь для поля measurements в Activity, как показано ниже, но я не уверен, как структурировать предложение where и что передается в родительском параметре с таблицей отношений «многие ко многим» в середине (предположим, что аналогично getActivities запрос используется для получения всех Activities и связанных с ними измерений, но не является входным параметром для запроса):

Activity: {
    measurements: (parent, args, { models }) => models.Measurement.findAll({
      where: {
        ????
      },
    }),
},

Для запроса, который пытается получить все Activities, когда тип Activity определен следующим образом:

getActivities: async (parent, args, { models }) => 
    models.ActivityEntry.findAll()

Если в распознавателе нет предложения where для поля measurements типа Activity, то каждое измерение возвращается под каждым Activity (а не только измерения, связанные с таблицей activity_measurement).

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

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

Ответы 1

Ответ принят как подходящий

Родительское значение, переданное распознавателю, отражает значение, которое было возвращено распознавателем родительского поля. В этом случае для поля measurements родительским полем является getActivities. Вы возвращаете массив экземпляров модели Activity в getActivities, поэтому родительское значение, переданное преобразователю поля measurements, также будет экземпляром вашей модели Activity.

Это означает, что вы можете сделать что-то вроде:

Activity: {
  measurements: (activity, args, { models }) => activity.getMeasurements(),
},

Спасибо Даниэль. Это сработало, но я обнаружил, что этот метод на самом деле занимает в два раза больше времени, чтобы вернуть результат, чем когда включения были в одном распознавателе, поэтому я еще не уверен, какой подход я выберу. Кроме того, из-за проблемы с линтером это было фактически упрощено до этого: Activity: { измерения: activity => activity.getMeasurements(), },

jbars 29.04.2019 04:45

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