Я настраиваю сервер 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).
Я пытаюсь выяснить, как получить только измерения, связанные с действием, которое будет возвращено при использовании отдельного определения типа действия с элементом измерений.


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