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

如何在Sequelize ORM中获取不带表名前缀的关联查询结果

解决Sequelize关联查询结果带表名前缀的问题

嘿,我之前也遇到过这个Sequelize关联查询带表名前缀的问题!其实只要调整一下查询配置就能轻松解决,我给你分享几个常用的方案:

方案1:用as自定义关联字段名(保留嵌套结构)

如果只是不想用表名作为关联数据的嵌套键,可以在关联定义或者查询语句里用as给关联起一个自定义名称,这样返回的结果里就会用你指定的名称代替表名前缀:

第一步:在模型中定义关联时指定as

// 在admin模型的定义文件中,添加关联
module.exports = (sequelize, Sequelize) => {
  const admin = sequelize.define('admin', { /* 字段定义 */ });
  
  // 给关联起别名userRole,代替默认的表名role
  admin.belongsTo(db.role, { as: 'userRole', foreignKey: 'roleId' });
  
  return admin;
};

第二步:查询时匹配as别名

db.admin.findAll({
  include: [{
    model: db.role,
    as: 'userRole', // 必须和关联定义的as一致
    attributes: ['id', 'name'] // 指定要返回的关联表字段
    // 你的where条件...
  }]
});

返回的结果结构会是这样(没有表名前缀的嵌套键):

{
  id: 1,
  username: 'admin_user',
  userRole: {
    id: 2,
    name: '超级管理员'
  }
}

方案2:平级返回关联字段(完全去掉嵌套和前缀)

如果想把关联表的字段和主表字段放在同一层级,不带任何表名前缀,可以通过Sequelize.col()给关联字段起别名,配合attributes配置实现:

db.admin.findAll({
  attributes: [
    'id',
    'username',
    // 用Sequelize.col指定关联表字段,然后起别名去掉前缀
    [Sequelize.col('role.name'), 'roleName'],
    [Sequelize.col('role.id'), 'roleId']
  ],
  include: [{
    model: db.role,
    attributes: [] // 不返回嵌套的关联对象
    // 你的where条件...
  }],
  raw: true // 开启raw模式返回扁平数据
});

返回的结果会是平级结构,完全没有表名前缀:

{ id: 1, username: 'admin_user', roleName: '超级管理员', roleId: 2 }

方案3:用nest: true保留嵌套结构且无字段前缀

如果使用raw: true模式时,默认会返回带表名前缀的扁平字段(比如role.id),只需加上nest: true配置,就能自动把关联字段嵌套成对象,且不带表名字段前缀:

db.admin.findAll({
  include: [{
    model: db.role,
    attributes: ['id', 'name']
    // 你的where条件...
  }],
  raw: true,
  nest: true // 开启嵌套模式
});

返回的结果是整洁的嵌套结构,字段名没有表名前缀:

{
  id: 1,
  username: 'admin_user',
  role: {
    id: 2,
    name: '超级管理员'
  }
}

注意事项

  • 如果主表和关联表存在同名字段(比如都有id),在平级返回时必须给关联字段起别名,否则会出现字段值被覆盖的问题。
  • 所有as配置必须在关联定义和查询语句中保持一致,否则会报错。

内容的提问来源于stack exchange,提问作者msthakur0064

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:37:39