如何在Sequelize中查询存在关联子模型B记录的模型A数据
问题原因
你原来的写法无法生效是因为Sequelize的where条件会在生成SQL查询阶段直接编译执行,而关联的bs数据是SQL查询返回后才组装到A实例上的,此时还没有关联数据可以做长度判断,所以过滤逻辑不会生效。
可行实现方案
方案1:通过INNER JOIN过滤(适合同时需要返回关联B数据的场景)
给include配置加上required: true,Sequelize会把默认的左连接转为内连接,自动过滤掉没有匹配B记录的A数据:
A.findAll({ include: { model: B, as: 'bs', required: true, // 核心配置 // 如果不需要返回B的字段,可加下面这行减少冗余数据返回 attributes: [] }, // 避免A关联多条B时出现重复的A记录,可加去重配置 distinct: true });
方案2:通过EXISTS子查询过滤(性能更优,适合大数据量场景)
直接用子查询判断是否存在关联的B记录,不需要做表连接,查询效率更高:
const { Op, literal } = require('sequelize'); A.findAll({ where: { [Op.exists]: literal(`(SELECT 1 FROM B WHERE B.关联A的外键字段 = A.id)`) // 注意把上面的「关联A的外键字段」替换为你B表里实际存A主键的字段名,比如a_id、aId这类 } });
方案选择建议
- 如果查询A的同时需要拿到关联的B数据,选方案1
- 如果只需要过滤有B关联的A,不需要返回B数据,优先选方案2,性能更好也不会有数据重复问题
内容的提问来源于stack exchange,提问作者dneumark
相关产品推荐
相关产品推荐

