Sequelize v6如何通过hasMany关联表字段过滤主表并返回全部关联数据
Sequelize hasMany关联表过滤查询解决方案
错误原因
你遇到的列不存在报错核心是两个问题:
- 直接在主查询
where中通过Sequelize.col引用关联表字段时,Sequelize默认不会将该字段识别为关联表字段,生成SQL时没有正确绑定关联表别名导致找不到列 - 你使用的
find方法是findOne的别名,仅返回单条数据,查询多条匹配数据应使用findAll
解决方案
方案1:EXISTS子查询实现(推荐)
该方案性能更高,不会产生笛卡尔积导致主表数据重复,且完全不影响关联返回全部RequestStatus数据:
const { Op, literal } = require('sequelize'); const result = await RequestForm.findAll({ where: { [Op.or]: [ { type: { [Op.in]: ["One", "Two"] } }, literal(`EXISTS ( SELECT 1 FROM RequestStatuses WHERE RequestStatuses.RequestFormId = RequestForm.id AND RequestStatuses.EmployeeId = '123e4567-e89b-12d3-a456-426614174000' )`) ] }, include: [ { model: RequestStatus, attributes: ['id', 'EmployeeId'], required: false }, // 你需要关联的其他模型 ], distinct: true });
注意:如果你的
RequestStatus模型自定义了tableName属性,请将子查询中的RequestStatuses替换为你实际的数据库表名。
方案2:关联字段引用语法实现
如果你不想写原生SQL,可以使用Sequelize内置的$关联名.字段$语法引用关联表字段:
const { Op } = require('sequelize'); const result = await RequestForm.findAll({ where: { [Op.or]: [ { type: { [Op.in]: ["One", "Two"] } }, { '$RequestStatuses.EmployeeId$': '123e4567-e89b-12d3-a456-426614174000' } ] }, include: [ { model: RequestStatus, attributes: ['id', 'EmployeeId'], required: false } ], distinct: true });
注意:如果你的
RequestForm.hasMany(RequestStatus)关联配置了as参数,请将上面的RequestStatuses替换为你设置的as别名。
内容的提问来源于stack exchange,提问作者osama nadeer
相关产品推荐
相关产品推荐

