具有多对多关系的类型元素的GraphQL解析器

具有多对多关系的类型元素的GraphQL解析器,graphql,sequelize.js,graphql-js,apollo-server,Graphql,Sequelize.js,Graphql Js,Apollo Server,我正在设置一个GraphQL Apollo服务器,并希望为一个对象类型定义一个解析器,该对象类型具有一个包含基于多对多关系的数据数组的元素 我有一个Measurement对象,它与具有多对多关系的活动对象关联: Measurement.belongsToMany(Activity, { as: 'activity', through: 'activity_measurement_entries', underscored: true }); Activity.belong

我正在设置一个GraphQL Apollo服务器,并希望为一个对象类型定义一个解析器,该对象类型具有一个包含基于多对多关系的数据数组的元素

我有一个
Measurement
对象,它与具有多对多关系的
活动
对象关联:

Measurement.belongsToMany(Activity, {
    as: 'activity',
    through: 'activity_measurement_entries',
    underscored: true
});
Activity.belongsToMany(Measurement, {
    as: 'measurements',
    through: 'activity_measurement_entries',
    underscored: true
});
当查询中直接包含
Measurement
时,解析程序查询对于
getActivities
查询非常有效,如下所示:

getActivities: async (parent, args, { models }) => {
    const activities = await models.Activity.findAll({
        include: [{
            model: models.Measurement,
            as: 'measurements',
        }],
    });
    return activities;
},
getActivities: async (parent, args, { models }) => 
    models.ActivityEntry.findAll()
通过Sequelize自动生成一个
activity\u measurement
表,该表包含
activity\u id
measurement\u id

< P> >我想在<代码>活动> <代码>下定义<代码>度量< /COD>字段,但我不知道如何构造WHERE子句,以及在父参数中传递多个多对关系表中间的内容。(假设使用类似的
getActivities
查询来获取所有
Activities
和相关测量值,但没有查询的输入参数):

对于当
活动
类型定义如下时尝试获取所有
活动
的查询:

getActivities: async (parent, args, { models }) => {
    const activities = await models.Activity.findAll({
        include: [{
            model: models.Measurement,
            as: 'measurements',
        }],
    });
    return activities;
},
getActivities: async (parent, args, { models }) => 
    models.ActivityEntry.findAll()
如果冲突解决程序中没有针对
活动
类型的
测量
字段的where子句,则每个测量都会在每个
活动
下返回(而不仅仅是通过
活动测量
表关联的测量)


我试图弄清楚,当使用单独的活动类型定义和度量元素时,如何仅获取与要返回的活动相关联的度量值。

传递给解析器的父值反映了父字段的解析器中返回的值。在这种情况下,对于
度量值
字段,父字段是
getActivities
。您将在
getActivities
中返回一个活动模型实例数组,因此传递给
度量
字段解析器的父值也将是
活动
模型的一个实例

这意味着您可以执行以下操作:

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

传递给冲突解决程序的父值反映了在父字段的冲突解决程序中返回的值。在这种情况下,对于
measurements
字段,父字段是
getActivities
。您在
getActivities
中返回一个活动模型实例数组,因此父值传递给
me测量
字段解析程序也将是您的
活动
模型的一个实例

这意味着您可以执行以下操作:

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

谢谢Daniel。这很管用,但我发现这个方法返回结果的时间实际上是包含在单个解析器中时的两倍,因此还不确定我将采用哪种方法。此外,由于linter问题,它实际上简化为:Activity:{measurements:Activity=>Activity.getMeasurements(),},谢谢Daniel。这很管用,但我发现这个方法返回结果的时间实际上是包含在单个解析器中时的两倍,所以我还不确定我将采用哪种方法。此外,由于linter问题,它实际上简化为:活动:{measurements:activity=>activity.getMeasurements(),},