如何在Node.js的Sequelize关联查询中获取扁平单对象结果
如何将Sequelize关联查询的嵌套地址字段平级输出?
嘿,我来帮你搞定这个问题!你现在需要把Sequelize关联查询返回的嵌套在addresses数组里的地址字段,平级放到用户对象的顶层,有两种实用的方法可以实现:
方法一:修改查询配置,直接返回平级结果
这种方法让Sequelize在查询阶段就返回你想要的平级结构,不需要额外处理数据:
// 记得先引入Sequelize哦 const Sequelize = require('sequelize'); myDb.user.findAll({ attributes: [ 'ID', 'NAME', // 指定关联表的字段,并设置别名匹配预期输出 [Sequelize.col('addresses.ADDRESS_1'), 'ADDRESS_1'], [Sequelize.col('addresses.ADDRESS_2'), 'ADDRESS_2'], [Sequelize.col('addresses.CITY'), 'CITY'], [Sequelize.col('addresses.STATE'), 'STATE'], [Sequelize.col('addresses.POSTCODE'), 'POSTCODE'] ], include: [{ model: myDb.addresses, as: 'addresses', attributes: [], // 这里留空,避免重复返回嵌套的addresses结构 required: true // 如果是一对一关联,确保只返回有地址的用户(可选) }], raw: true // 开启raw模式,返回原始的平级数据对象 }).then((getCustomer) => { // 现在输出的结构就是你预期的平级格式啦 console.log(getCustomer); });
原理说明:通过Sequelize.col()明确指定关联表的字段,结合raw: true让Sequelize跳过模型实例的构建,直接返回数据库查询的平级结果,完美匹配你的预期输出。
方法二:在查询后手动处理数据结构
如果不想修改查询配置,可以在拿到结果后用JavaScript的数组方法调整结构:
myDb.user.findAll({ attributes: ['ID','NAME'], include: [{ model: myDb.addresses, as: 'addresses', attributes:['ADDRESS_1','ADDRESS_2','CITY','STATE','POSTCODE'], }] }).then((getCustomer) => { // 将模型实例转为普通对象,并合并地址字段 const formattedResult = getCustomer.map(item => { const { addresses, ...userInfo } = item.toJSON(); // 因为你的addresses是数组,取第一个元素合并到用户对象中 return { ...userInfo, ...addresses[0] }; }); console.log(formattedResult); });
注意事项:如果你的user和addresses是一对多关联,addresses数组可能有多个元素,这时候你需要根据业务需求选择取第一个地址,或者做其他处理(比如拼接多个地址)。从你的预期输出来看,应该是一对一关联,所以addresses[0]完全适用。
内容的提问来源于stack exchange,提问作者Manimaran
相关产品推荐
相关产品推荐

