Sequelize嵌套预加载(nested eager loading)查询仅返回1条记录问题
问题根因
该查询结果差异分为两种可能场景,对应不同原因:
- 主表
Treatment中treatment_autoid匹配多条记录
当前调用的findOne是Sequelize内置的单条查询方法,无论底层SQL命中多少条主记录,该方法始终仅返回第一条符合条件的主记录,两端执行结果差异是方法本身的特性导致的。 - 主表
Treatment中treatment_autoid仅匹配1条记录,原生SQL因联表返回多条扁平化结果
该情况属于ORM的正常结果组装逻辑:Sequelize会自动把原生SQL返回的多条扁平化联表记录,聚合为1条主记录,关联的子表数据会嵌套到主记录的对应属性中,不会像原生SQL一样返回多条扁平化行。
修复方案
- 若业务需要获取所有匹配的主表记录,将
findOne替换为findAll方法即可,修改后代码如下:
_db.Treatment.findAll({ where: { treatment_autoid: req.treatment_id }, include: [ { model: _db.TreatmentSection, include: { model: _db.TreatmentSectionChannel, }, } ] })
- 若确认主表仅有1条匹配记录,仅需要查看所有关联的子表数据,直接访问返回主记录的关联属性(属性名由你定义的关联别名决定,默认通常为模型名的复数形式)即可拿到全量子记录,无需修改查询逻辑。
提示:你贴出的原始代码缺少
include数组的闭合方括号和查询方法的闭合括号,实际运行时需要补全避免语法报错。
内容的提问来源于stack exchange,提问作者Yehuda Zadik
相关产品推荐
相关产品推荐

