Sequelize中如何基于已定义模型实现两表Inner Join内连接查询
Sequelize 实现非原生SQL的Inner Join查询方案
前置要求
Sequelize 做关联查询必须提前定义模型间的关联关系,直接调用查询方法无法生成JOIN语句。
步骤1:定义模型关联
找到项目中统一加载模型、初始化关联的文件(通常是数据库连接的index.js,也可以在两个模型定义完成后直接编写),添加1:1关联配置,匹配你需要的t1.id = t2.id关联条件:
import Table1 from './table1.model.js' import Table2 from './table2.model.js' // 以Table2为查询主表,关联Table1 Table2.hasOne(Table1, { foreignKey: 'id', // 关联目标表Table1的匹配字段 sourceKey: 'id' // 用当前表Table2的id字段做等值匹配 })
如果后续需要从Table1反向关联查询Table2,可以补充
Table1.belongsTo(Table2, { foreignKey: 'id', targetKey: 'id' }),本次查询不需要配置。
步骤2:编写Inner Join查询代码
Sequelize中include配置项的required: true参数就对应INNER JOIN逻辑(默认值false对应LEFT JOIN),直接调用findAll方法即可:
const queryResult = await Table2.findAll({ // 主表Table2(对应SQL里的t2)要返回的字段:注意email字段在Table1上,不要写在这里 attributes: ['number', 'status'], // 查询条件:你示例SQL里的t2.email是笔误,根据给出的表结构email属于Table1 where: { '$table_1.email$': 'test.test@test.com' }, include: [ { model: Table1, // 关联表Table1(对应SQL里的t1)要返回的字段 attributes: ['id', 'name', 'email'], required: true // 核心配置:开启后自动生成INNER JOIN } ], raw: true // 可选:加上后返回结果为打平的单层对象,和原生SQL返回结构一致;不加则返回嵌套结构 })
补充说明
- 如果定义关联时加了
as自定义别名,比如Table2.hasOne(Table1, { as: 't1Info', ... }),include块必须同步添加as: 't1Info',字段过滤路径也要对应改成$t1Info.email$ - 关联表的过滤条件除了写在顶层where用
$关联路径.字段$的方式,也可以直接写在include块的where配置里,生成的SQL完全一致 - 不加
raw: true时,返回结构为嵌套格式:{ number: '', status: '', table_1: { id: '', name: '', email: '' } },根据业务场景选择是否开启即可
内容的提问来源于stack exchange,提问作者DayIsGreen
相关产品推荐
相关产品推荐

