乐闻世界logo
搜索文章和话题
sequelize 关联关系(一对一、一对多、多对多)

sequelize 关联关系(一对一、一对多、多对多)

乐闻的头像
乐闻

2022年06月18日 12:20· 阅读 1014

准备工作

为了演示 sequelize 的多表间关联关系,首先我先准备两个实体:user 、role。

1. 初始化 sequelize 连接

javascript
const { Sequelize, DataTypes } = require('sequelize'); const sequelize = new Sequelize({ host: '127.0.0.1', port: 3306, username: 'root', password: 'mypassword', database: 'sequelize-db', dialect: 'mysql', logging: console.log, });

2. 定义实体

javascript
const User = sequelize.define( 'user', { name: DataTypes.STRING, }, { tableName: 'user_t', timestamps: false, }, ); const Role = sequelize.define( 'role', { name: DataTypes.STRING, }, { tableName: 'role_t', timestamps: false, // 不想要 createdAt createdAt: false, // 想要 updatedAt 但是希望名称叫做 updateTimestamp updatedAt: 'updateTimestamp', }, ); // 如果表不存在,则创建该表 sequelize.sync();

关联关系

一对一

javascript
// 1. 基本版 User.hasOne(Role); Role.belongsTo(User); // 2. 自定义关联外键 User.hasOne(Role, { foreignKey: 'user_id' }); Role.belongsTo(User); // 3. 自定义关联外键 User.hasOne(Role); Role.belongsTo(User,{ foreignKey:{ name: 'user_id', type: DataTypes.UUID } });

image-20210129205544568

一对多

javascript
// 1. 基本版 User.hasMany(Role); Role.belongsTo(User); // 2. 自定义关联外键 User.hasMany(Role, { foreignKey: 'user_id' }); Role.belongsTo(User); // 3. 自定义关联外键 User.hasMany(Role); Role.belongsTo(User,{ foreignKey:{ name: 'user_id', type: DataTypes.UUID } });

image-20210129210357357

多对多

javascript
1. 基础版 User.belongsToMany(Role, { through: 'User_Role' }); Role.belongsToMany(User, { through: 'User_Role' }); 2. 自定义关联外键 const UserRole = sequelize.define('UserRole', { userId: { type: DataTypes.INTEGER, references: { model: User, // 'User' 也可以使用 key: 'id', }, }, roleId: { type: DataTypes.INTEGER, references: { model: Role, // 'Role' 也可以使用 key: 'id', }, }, }); Role.belongsToMany(User, { through: 'UserRole' }); User.belongsToMany(Role, { through: 'UserRole' });

image-20210129211719320

关联查询

预先加载

javascript
await User.findOne({ include: Role });

延迟加载

javascript
//1. 先查询 user let user = await User.findOne({ where: 1 }); // 2. 再关联查询 role let role = await user.getRole();

参考文档:sequelize 中文文档

标签: