Sequelize关联模型查询:修改返回属性键名的问题
解决Sequelize raw模式下关联字段键名转换问题
针对你遇到的问题——在使用raw: true查询时,关联的Image模型的name字段以image.name的键名返回,想要将其转为顶级属性,这里有两种实用的解决方法:
方法一:查询后手动处理结果
这是最直接的方式,拿到查询结果后手动调整字段结构:
User.findOne({ include: [ { model: Image, attributes: ["name"], required: true}, ], raw: true, }).then((user) => { if (user) { // 将image.name的值赋值给顶级属性ImageName user.ImageName = user['image.name']; // 删除原来的带前缀的字段 delete user['image.name']; } // 后续处理逻辑 })
方法二:通过查询配置直接生成目标结构
这种方法在数据库查询阶段就指定返回的字段结构,避免后续手动处理,更高效:
首先确保你已经引入了Sequelize实例(比如从你的数据库连接文件中),然后修改查询代码:
// 假设sequelize是你的Sequelize实例 User.findOne({ // 明确指定User本身需要的字段,以及关联的image.name作为顶级属性 attributes: [ 'id', // 替换成你实际需要的User字段 'username', [sequelize.col('image.name'), 'ImageName'] // 将image.name别名设为顶级的ImageName ], include: [ { model: Image, attributes: [], required: true}, // 这里设空属性,避免重复返回image.name字段 ], raw: true, }).then((user) => { // 此时user对象会包含id、username、ImageName这些顶级属性 })
为什么你之前的写法不生效?
你尝试的{ model: Image, attributes: [["name",""]] }有两个问题:
- 别名设置为空字符串没有意义,Sequelize依然会带上关联模型的表名前缀,最终生成
image.这样的无效键名 - 在
raw: true模式下,关联模型的字段默认会以模型名.字段名的格式返回,仅修改关联模型的属性别名无法摆脱这个前缀
内容的提问来源于stack exchange,提问作者Avedis Maroukian
相关产品推荐
相关产品推荐

