Sequelize执行SELECT查询时为何会添加额外重复关联列?
解决Sequelize关联查询时关联列重复返回的问题
我太懂这种烦恼了——用Sequelize做关联查询的时候,结果里总是多出一个重复的关联列,看着特别闹心!其实这是Sequelize的默认行为导致的,下面给你几个实用的解决办法:
方法1:精准指定查询字段(主表+关联表)
在查询时,通过attributes明确指定主表需要返回的字段,同时给关联表也设置attributes排除重复的主键(因为它和主表的外键值是完全一致的)。比如你的result关联test的场景:
const results = await Result.findAll({ attributes: ['id', 'test_id', 'item_id'], // 只选主表需要的字段 include: [{ model: Test, attributes: ['name', 'description'] // 排除关联表的id,避免和主表test_id重复 }] });
方法2:关联定义时隐藏重复字段
如果这个关联查询你用得很频繁,可以在模型关联定义的时候就设置默认返回的字段,一劳永逸:
// 在result模型的关联定义里 Result.belongsTo(Test, { foreignKey: 'test_id', attributes: ['name', 'description'] // 默认只返回这些字段,不返回关联表的id });
方法3:使用raw: true时开启nest避免字段冲突
如果你习惯用原始数据格式(raw: true),记得加上nest: true,这样关联数据会被嵌套在子对象里,不会和主表字段平级导致重复混淆:
const results = await Result.findAll({ raw: true, nest: true, include: [Test] });
额外提示:重命名重复字段(如果需要保留)
万一你确实需要同时保留两个字段(比如有特殊业务需求),可以给其中一个字段重命名:
const results = await Result.findAll({ attributes: ['id', ['test_id', 'result_test_id'], 'item_id'], // 给主表外键重命名 include: [{ model: Test, attributes: ['id', 'name'] }] });
这样返回的结果里,主表的外键会变成result_test_id,和关联表的id就不会混淆啦!
内容的提问来源于stack exchange,提问作者Maikkeyy
相关产品推荐
相关产品推荐

