如何在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
相关产品推荐
相关产品推荐

