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

时间:2019-04-26 03:34:56

标签: graphql sequelize.js graphql-js apollo-server

我正在设置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_measurementactivity_id组成的Sequelize会自动生成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()

如果解析器中没有针对measurements类型的Activity字段的where子句,则每个度量都将返回到每个Activity下(而不只是通过{相关联的度量) {1}}表)。

我试图弄清楚如何在将单独的Activity类型定义与Measurements元素一起使用时,仅获取与Activity相关的度量。

1 个答案:

答案 0 :(得分:0)

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

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

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