具有多对多关系的类型元素的 GraphQL 解析器
Posted
技术标签:
【中文标题】具有多对多关系的类型元素的 GraphQL 解析器【英文标题】:GraphQL resolver for type element having many to many relationship 【发布时间】:2019-09-15 13:06:45 【问题描述】:我正在设置一个 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
表,其中包含activity_id
和measurement_id
。
我想为Activity
上的measurements
字段定义一个解析器,如下所示,但我不确定如何构造 where 子句以及使用多对多关系表在父参数中传递的内容在中间(假设使用类似的getActivities
查询来获取所有Activities
和相关的测量值,但查询没有输入参数):
Activity:
measurements: (parent, args, models ) => models.Measurement.findAll(
where:
????
,
),
,
对于在 Activity
类型定义如下时尝试获取所有 Activities
的查询:
getActivities: async (parent, args, models ) =>
models.ActivityEntry.findAll()
如果Activity
类型的measurements
字段的解析器中没有where 子句,则每个测量值都会在每个Activity
下返回(而不仅仅是通过activity_measurement
表关联的测量值)。
我试图弄清楚在使用带有测量元素的单独 Activity 类型定义时如何仅获取与要返回的 Activity 关联的测量值。
【问题讨论】:
【参考方案1】:传递给解析器的父值反映了在父字段的解析器中返回的值。在这种情况下,对于measurements
字段,父字段是getActivities
。您将在 getActivities
中返回一个 Activity 模型实例数组,因此传递给 measurements
字段解析器的父值也将是您的 Activity
模型的实例。
这意味着您可以执行以下操作:
Activity:
measurements: (activity, args, models ) => activity.getMeasurements(),
,
【讨论】:
谢谢丹尼尔。这行得通,但我发现这个方法实际上花费了两倍的时间来返回结果,因为包含在单个解析器中,所以我不确定我会采用哪种方法。此外,由于 linter 问题,它实际上被简化为: Activity: measurements:activity => activity.getMeasurements(), ,以上是关于具有多对多关系的类型元素的 GraphQL 解析器的主要内容,如果未能解决你的问题,请参考以下文章