如何在Sequelize的include操作中将关联字段平级到主对象
解决方案
方法1:通过Sequelize查询配置直接生成扁平化结果
直接在findAndCountAll的attributes中指定关联表的字段,用Sequelize.col映射到主对象的平级属性,同时隐藏关联模型的原始字段:
const { Sequelize } = require('sequelize'); const result = await SelectedEmployees.findAndCountAll({ attributes: [ // 保留SelectedEmployees自身需要的字段 'id', 'selectedDate', // 映射User表的字段到平级属性 [Sequelize.col('user.id'), 'userId'], [Sequelize.col('user.name'), 'userName'], [Sequelize.col('user.email'), 'userEmail'] ], include: [{ model: User, attributes: [], // 不返回User的嵌套对象 required: true // 按需设置是否为内连接,false则为左连接 }], raw: true // 启用raw模式,直接返回普通对象 });
这种方式查询后,result.rows里的每个对象都会直接包含userId、userName、userEmail这些平级字段,无需额外处理。
方法2:查询后手动处理结果
如果需要保留Sequelize模型实例的方法(比如后续调用save()),可以先正常查询,再遍历结果手动扁平化:
const { count, rows } = await SelectedEmployees.findAndCountAll({ include: [{ model: User, attributes: ['id', 'name', 'email'] // 只查询需要的User字段 }] }); // 遍历处理每一条数据 const flattenedRows = rows.map(item => { // 先转成普通JSON对象,避免模型实例的干扰 const plainItem = item.toJSON(); // 解构出user和剩余字段,再合并平级属性 const { user, ...rest } = plainItem; return { ...rest, userId: user.id, userName: user.name, userEmail: user.email }; }); // 返回处理后的结果 return { count, rows: flattenedRows };
为什么raw: true和nest: true达不到需求?
默认情况下,raw: true会将关联字段以user.id、user.name的形式返回(不带nest: true),或者返回嵌套的user对象(带nest: true),但不会自动将关联字段平级到主对象中。上面两种方法分别从查询配置和结果处理两个层面解决了这个问题。
内容的提问来源于stack exchange,提问作者Utkarsh
相关产品推荐
相关产品推荐

