You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:15:03