Средство распознавания GraphQL для элемента типа, имеющего отношение многие ко многим - PullRequest
1 голос
/ 26 апреля 2019

Я настраиваю сервер 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).

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

1 Ответ

0 голосов
/ 26 апреля 2019

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

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

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