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

GraphQL resolver for type element having many to many relationship

我正在设置一个 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
});

Measurement 直接包含在查询中时,解析器查询对 getActivities 查询工作正常:

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

通过Sequelize自动生成一个activity_measurement table,其中包含activity_idmeasurement_id.

我想为 Activity 上的 measurements 字段定义解析器,如下所示,但我不确定如何构建 where 子句以及在父参数中传递的内容中间的多对多关系 table(假设类似的 getActivities 查询用于获取所有 Activities 和关联的测量值,但查询没有输入参数):

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

对于尝试获取所有 Activities 的查询,当 Activity 类型定义如下:

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

如果 Activity 类型的 measurements 字段的解析器中没有 where 子句,则每个 Activity 下的每个测量都返回(而不是仅通过关联的测量activity_measurement table).

我想弄清楚如何在将单独的 Activity 类型定义与测量元素一起使用时仅获取与要返回的 Activity 关联的测量值。

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

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

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