如何在Sequelize关联属性中展平中间表字段?
如何在Sequelize中将belongsToMany中间表字段展平到关联模型对象中
方案1:查询阶段直接映射字段(推荐)
通过Sequelize的字段引用功能,在关联模型的属性列表中直接包含中间表字段,同时关闭中间表对象的返回:
首先引入Sequelize的col工具:
const { Sequelize, col } = require('sequelize');
修改查询语句:
const stage = await Stages.findByPk(stageId, { include: [ { association: 'users', attributes: [ 'id', 'userName', 'userPhoto', // 直接引用中间表字段并设置别名 [col('StageUsers.userRemainingBudget'), 'userRemainingBudget'] ], through: { attributes: [] }, // 不返回嵌套的StageUsers对象 }, ], raw: true, // 启用原始查询模式,让字段直接关联到用户对象 nest: true // 保持关联模型的嵌套结构,避免字段扁平化到根层级 });
执行后返回的stage结构将完全符合期望,中间表的userRemainingBudget会直接出现在每个users数组的对象中。
方案2:查询后手动处理结果
如果不想启用raw模式,可以在查询完成后手动遍历数据,将中间表字段移到用户对象中:
const stage = await Stages.findByPk(stageId, { include: [ { association: 'users', attributes: ['id', 'userName', 'userPhoto'], through: { attributes: ['userRemainingBudget'] }, }, ], }); // 转换为普通对象并处理用户数组 const stageData = stage.toJSON(); stageData.users = stageData.users.map(user => { // 解构出中间表数据和用户基础数据 const { StageUsers, ...userInfo } = user; return { ...userInfo, userRemainingBudget: StageUsers.userRemainingBudget }; }); return stageData;
这种方法的优势是保留Sequelize模型实例的特性(如果后续需要使用模型方法),适合需要额外数据处理的场景。
内容的提问来源于stack exchange,提问作者Kyomen
相关产品推荐
相关产品推荐

