提问者:小点点

BelongsToMany eager loading为每个关联返回多个


我有两个模型:用户和经济活动。 它们通过UserEconomicActivity(这是一个BelongsToMany关系)进行关联。 在User model中,我定义了这样的关联:

this.belongsToMany(models.EconomicActivity, {
  through: 'UserEconomicActivity',
  as: 'economicActivities',
  otherKey: {
    name: 'economicActivityId',
    allowNull: false
  },
  foreignKey: {
    name: 'userId',
    allowNull: false
  }
})

我试图向用户查询它与一个或多个经济活动关联的位置,如下所示:

const users = await User.findAll({
  include: [
    {
      model: EconomicActivity,
      as: 'economicActivities',
      where: {
        id: filters.economicActivities // This is an array with IDs I want to filter
      }
    }
  ],
  raw: true,
  nest: true
})

假设一个特定的用户与2个经济活动相关联。 当我运行这个查询时,它返回同一个用户两次,每个关联一次。 我只想返回同一个用户一次,其中包含一个相关的economicActivities数组(如user.economicActivities)。 这可能吗?


共2个答案

匿名用户

通过将raw设置为true,您将显式地请求此结果格式。 我在这里也没有看到nest的使用。

我建议您删除这两个参数。

有关更多信息,请参阅Sequelize API参考。

匿名用户

正如我在评论中所说的,我需要使用raw和nest,因为我要将数据传递给Handlebars,而Handlebars只能输出普通JavaScript对象,否则它会给我错误Handlebars:Access已被拒绝解析属性“name”,因为它不是其父级的“自有属性”,并且不会输出数据。

但是,我找到了一种方法,可以获得一个普通的JavaScript对象,并将所有关联保留在一个数组中:

await this.model.findAll(query).map(item => item.get({ plain: true }))

模型的get方法完全符合我的要求。 因为我使用的是findAll,所以我使用ES6 map方法从查询返回的每个模型中调用get。