如何在Sequelize中使用join,将指定原生SQL转换为Sequelize查询
原生SQL转Sequelize查询实现方案
首先修正你提供的SQL笔误,完整的原生SQL逻辑如下:
SELECT s.uid, s.NAME, u.NAME as fname FROM users u INNER JOIN s ON s.uid = u.id WHERE s.cid = 300;
第一步:定义模型并配置关联
你需要先定义两个表对应的Sequelize模型,并且配置好关联关系:
1. 定义User模型(对应users表)
const { DataTypes } = require('sequelize'); const User = sequelize.define('User', { id: { type: DataTypes.INTEGER, primaryKey: true }, name: { type: DataTypes.STRING, field: 'NAME' // 和数据库实际字段名对齐 } }, { tableName: 'users', timestamps: false // 表无createAt、updateAt字段时需关闭 });
2. 定义S模型(对应s表)
const S = sequelize.define('S', { uid: DataTypes.INTEGER, name: { type: DataTypes.STRING, field: 'NAME' }, cid: DataTypes.INTEGER }, { tableName: 's', timestamps: false });
3. 配置关联关系
// User表和S表一对多关联,关联别名设为s User.hasMany(S, { foreignKey: 'uid', sourceKey: 'id', as: 's' });
第二步:编写Sequelize查询语句
const result = await User.findAll({ // 指定要查询的字段 attributes: [ [sequelize.col('s.uid'), 'uid'], [sequelize.col('s.NAME'), 's_name'], ['NAME', 'fname'] ], // 关联查询配置 include: [{ model: S, as: 's', attributes: [], // 不需要返回关联对象的全部字段,设为空 required: true, // 开启后为INNER JOIN,默认是LEFT JOIN where: { cid: 300 } }], raw: true // 直接返回JSON数据,不需要Sequelize实例对象时可加 });
注意事项
- 如果你的表字段大小写规则、模型命名和示例不同,需要对应调整配置
- 如果你想从S模型出发做关联查询,只需要把关联关系改成
S.belongsTo(User, {foreignKey: 'uid', as: 'u'}),再调整查询的主模型和include配置即可
内容的提问来源于stack exchange,提问作者MrBanjade
相关产品推荐
相关产品推荐

