具有多对多关系的类型元素的 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_idmeasurement_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 解析器的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL Apollo 中的多对多关系

如何解决具有多对多关系的石墨烯 django 节点字段

用于可迭代对象的 Java GraphQL 解析器:休眠异常

从多对多关系中获取结果

查询放大graphql多对多关系

如何在graphql突变中设置多对多关系?