具有多对多关系的类型元素的GraphQL解析器
我正在设置一个GraphQL Apollo服务器,并希望为一个对象类型定义一个解析器,该对象类型具有一个包含基于多对多关系的数据数组的元素 我有一个具有多对多关系的类型元素的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
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(),},