Sequelize多表联查分组嵌套模型时,主查询无法排除主键问题咨询
解决Sequelize主查询设置
attributes: []仍返回主键的问题 嘿,这个问题我太熟了!我上周刚在项目里踩过这个Sequelize的小坑——主查询里哪怕你把attributes设成空数组,主键还是会被自动返回,但嵌套的include里这个设置却能正常生效对吧?这其实是Sequelize的默认行为导致的,主模型会强制保留主键来维持实例的完整性,不过我们有几个办法能解决:
方法1:明确排除主键字段
不要用空的attributes数组,而是用exclude选项指定要去掉的主键字段,这样就能精准移除主键了:
const queryResult = await YourMainModel.findAll({ attributes: { exclude: ['id'] }, // 明确排除主模型的主键 include: [ { model: YourNestedModel, attributes: [], // 这里的空数组正常生效,不会返回嵌套模型的字段 required: true, // 启用内连接 group: ['YourMainModel.targetField'] } ], group: ['YourMainModel.targetField'] });
方法2:开启raw: true模式完全控制返回字段
如果上面的方法不符合你的需求,可以开启原生查询模式,这时候Sequelize不会自动添加任何默认字段,空的attributes数组就能完全生效:
const queryResult = await YourMainModel.findAll({ raw: true, attributes: [], // 空数组生效,主模型不会返回任何字段 include: [ { model: YourNestedModel, attributes: [], required: true } ], group: ['YourMainModel.targetField'] });
注意:开启
raw: true后返回的是普通对象,不是Sequelize模型实例,如果需要实例的话这个方法就不适用了。
方法3:明确指定需要的字段而非排除
如果你的主查询只需要少数几个字段,直接在attributes里列出这些字段,而不是用空数组或排除,这样主键也不会被包含进来:
const queryResult = await YourMainModel.findAll({ attributes: ['targetField1', 'targetField2'], // 只返回需要的字段 include: [ { model: YourNestedModel, attributes: [], required: true, group: ['YourMainModel.targetField1'] } ], group: ['YourMainModel.targetField1'] });
为什么会出现这个问题?
Sequelize的主模型查询默认会强制包含主键,这是框架为了保证模型实例的唯一性和可追踪性设计的,但嵌套关联的查询不会有这个强制逻辑,所以嵌套里的attributes: []能正常生效。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

