Sequelize中如何实现Mongoose的Schema.Types.ObjectId关联引用功能?
Sequelize中如何实现Mongoose的Schema.Types.ObjectId关联引用功能?
刚接触Sequelize和数据库的话,确实会觉得它和Mongoose的写法差异挺大的,别担心,我来帮你把这个关联逻辑弄明白~
在Mongoose里我们习惯直接在Schema字段里用Schema.Types.ObjectId加ref来关联其他模型,但Sequelize作为关系型数据库的ORM,是通过模型间的关联方法来实现这种引用关系的,而不是直接在字段类型里声明。下面是具体的实现步骤:
1. 定义TokenModel的外键字段
首先,你需要在TokenModel里定义一个对应User模型主键的字段,类型要和User模型的主键类型完全匹配:
- 如果你的User模型用的是默认的自增整数主键(比如
id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }),那user字段就用Sequelize.INTEGER; - 如果User用的是UUID作为主键,就把类型改成
Sequelize.UUID。
2. 建立模型间的关联关系
定义完字段后,要在两个模型之间显式声明关联:TokenModel属于(belongsTo)一个User,这样就能把TokenModel里的user字段和User的主键绑定起来,实现类似Mongoose里ref的效果。
完整的代码示例
修改你原来的代码,最终应该是这样的:
const User = require('../').user; const { Sequelize } = require('sequelize'); module.exports = function (sequelize) { const TokenModel = sequelize.define("TokenModel", { // 定义外键字段,类型和User的主键一致 user: { type: Sequelize.INTEGER, // 如果User用UUID就改成Sequelize.UUID allowNull: false, // 每个Token必然属于某个用户,所以设为不允许为空 references: { model: User, // 可选:显式指定关联的模型 key: 'id' // 对应User模型的主键字段 } }, refreshToken: { type: Sequelize.STRING, }, }, { timestamps: false }); // 核心关联:TokenModel属于一个User TokenModel.belongsTo(User, { foreignKey: 'user', // 指定TokenModel里的外键字段名 targetKey: 'id' // 指定User模型里的对应主键字段 }); // 可选:给User模型反向关联,方便从User查询关联的Token User.hasMany(TokenModel, { foreignKey: 'user', sourceKey: 'id' }); return TokenModel; }
额外说明
- 代码里的
references配置是可选的,它会让Sequelize在数据库层面创建外键约束,保证数据一致性(比如不能插入一个不存在的User ID); - 当你创建Token实例时,直接给
user字段传入对应的User ID即可,和你原本的逻辑一致; - 之后查询Token时,可以用
include方法关联查询对应的User信息,比如:const tokenWithUser = await TokenModel.findOne({ where: { refreshToken: '你的refreshToken值' }, include: User });
这样就能直接拿到关联的User数据啦~
备注:内容来源于stack exchange,提问作者Vladimir Taburkin
相关产品推荐
相关产品推荐

