我有两个模型:用户和经济活动。 它们通过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)。 这可能吗?
通过将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。