使用Sequelize做多表查询时如何添加E表tmpField字段的查询约束
Sequelize 深层关联表字段约束正确实现方案
原代码失效原因
你写的$E.tmpField$字段引用路径不完整,E属于A→B→C层级下的关联表,不能直接用E做顶层引用。
两种可用实现方式
方式1:顶层where补全关联路径
如果要在查询的顶层where中配置条件,把字段引用路径补全为完整的关联层级即可:
await A.findOne({ include: [ { model: B, include: [ { model: C, include: [D, E], }, ], }, { model: F, include: [G], }, ], where: { name: { [Op.in]: nameList }, // 补全完整的关联层级路径,没有自定义as的情况下直接用模型名 '$B.C.E.tmpField$': 100 }, });
注意:如果定义关联的时候给关联关系设置了
as别名,这里路径里的每一级都要替换成对应的别名,不能再用模型名。
方式2:把条件写在对应关联表的配置中(更推荐)
把过滤条件直接绑定到E表的include配置里,逻辑更清晰,也不会出现路径写错的问题:
await A.findOne({ include: [ { model: B, include: [ { model: C, include: [ D, { model: E, // 这里写E表的过滤条件 where: { tmpField: 100 }, // 加required: true 会把关联转为内连接,只返回满足E表条件的数据 // 不加的话是左连接,不满足条件的E字段会返回null,父级数据仍保留 required: true } ], }, ], }, { model: F, include: [G], }, ], where: { name: { [Op.in]: nameList } }, });
内容的提问来源于stack exchange,提问作者user2983616
相关产品推荐
相关产品推荐

