Sequelize关联查询如何去除关联表字段的前缀别名?
Sequelize关联查询去掉关联表字段前缀的解决方法
你的需求是查询关联表时,关联字段不自动带上关联别名前缀,直接返回字段原名,可以通过以下两种常用方案实现:
方案1:手动指定字段别名(推荐,兼容性最好)
通过sequelize.col指定关联表字段,再设置和字段名一致的别名,生成的SQL就不会出现_users.xxx的前缀别名:
const { sequelize } = require('./你的sequelize实例路径'); // 遍历User模型的所有属性,自动生成别名配置,不用手动一个个写 const userAttributes = Object.keys(User.rawAttributes).map(field => [ sequelize.col(`_users.${field}`), field ]); const abonados = await Domicilio.findAll({ include: { model: User, attributes: [] // 这里清空关联的默认属性,避免重复返回 }, // 主表字段 + 处理好别名的用户表字段 attributes: [ 'DomicilioId', // 其他你需要的Domicilio表字段 ...userAttributes ], raw: true // 如果不需要返回Sequelize实例,直接返回平层对象可以加这个参数 });
这个方案生成的SQL中,关联表字段的别名会直接设置为字段原名,完全符合你的要求。
方案2:查询后处理返回结果
如果你不想修改查询逻辑,也可以在拿到原始查询结果后,统一去掉字段的前缀:
const abonados = await Domicilio.findAll({ include: User, raw: true // 必须加raw参数返回平层键值对 }); // 统一处理字段名,去掉`_users.`前缀 const formattedAbonados = abonados.map(item => { const processed = {}; for (const [key, value] of Object.entries(item)) { const newKey = key.replace(/^_users\./, ''); processed[newKey] = value; } return processed; });
注意事项
- 如果Domicilio表和User表存在同名字段,直接去掉前缀会出现字段覆盖的问题,这种情况建议你给同名字段单独设置别名区分。
- 你当前的关联配置
Domicilio.hasMany(User, {foreignKey: 'UserId'})生成的关联条件是domicilio.DomicilioId = _users.UserId,如果这个逻辑不符合你的业务需求,可以调整外键配置。
内容的提问来源于stack exchange,提问作者Francisco Jarma
相关产品推荐
相关产品推荐

