本文详解Node.js中Sequelize ORM框架的四种核心关联关系:hasOne、belongsTo、hasMany及belongsToMany。通过User、UserCheckin、UserAddress和Role四个模型示例,演示如何定义1:1、1:N及N:M关系,并展示从模型同步到数据库及执行增删改查的完整流程。
Sequelize关联关系概述
Sequelize模型间存在关联,对应数据库表的主/外键关系。基于模型关系可实现关联表的连接查询、更新及删除等操作。本文通过示例介绍模型定义、关联关系创建、模型与关联同步至数据库,以及关系模型的增删改查操作。
数据库表间存在基于主/外键的关联及约束。关系表中的数据关联分为1对1(1:1)、1对多(1:M)及多对多(N:M)三种类型。
四种核心关联方法详解
在Sequelize中建立关联,需调用源模型的belongsTo、hasOne、hasMany、belongsToMany方法,并将目标模型作为参数传入。这些方法按以下规则创建关联:
hasOne - 与目标模型建立1:1关联,外键存在于目标模型中。
belongsTo - 与目标模型建立1:1关联,外键存在于源模型中。
hasMany - 与目标模型建立1:N关联,外键存在于目标模型中。
belongsToMany - 与目标模型建立N:M关联,通过sourceId和targetId创建交叉表。
模型示例与E-R结构
为清晰说明模型关系定义及使用,定义以下4个模型对象:
用户(User)-与其他模型存在1:1、1:N、N:M关系
用户登录信息(UserCheckin)-与User存在1:1关系
用户地址(UserAddress)-与User存在N:1关系
角色(Role)-与User存在N:M关系
这些模型的E-R结构如下:

接下来展示代码,代码与瓷土不符,请注意!
代码编写水平有限,无奈之举,!
代码实现与注意事项
/**
* 大家就按照我的步骤来,一点一点,要有耐心哦
* 我相信,最后肯定有你想要的!加油
*/
//引入框架
const Sequelize = require('sequelize');
//创建ORM实例
const sequelize = new Sequelize('sequlizedb', 'root', 'guoguo',
{
'dialect': 'mysql', // 数据库使用mysql
}
);
//验证连接
sequelize
.authenticate()
.then(() => {
console.log('链接成功');
})
.catch((error) => {
console.log('链接失败' + error);
})
//模型的创建
const User = sequelize.define('user', {
name: Sequelize.STRING,
age: Sequelize.INTEGER,
}, {
freezeTableName: true,
});
// User.create({
// name: 'guo',
// age: 25
// })
// .then((result) => {
// console.log('=======添加成功===================');
// console.log(result);
// console.log('==========================');
// })
// .catch((error) => {
// console.log('==========================');
// console.log('添加失败' + error);
// console.log('==========================');
// });
// const Role=sequelize.define('role',{
// name:{
// type:sequelize.STRING,
// }
// },
// {freezeTableName:true});
const Message = sequelize.define('message', {
text: Sequelize.STRING,
}, {
freezeTableName: true,
});
const Image = sequelize.define('image', {
url: Sequelize.STRING,
}, {
freezeTableName: true,
});
//删除表
// sequelize.drop()
// .then((logging)=>{
// console.log('==========================');
// console.log('删除成功!'+logging);
// console.log('==========================');
// })
// .catch((error)=>{
// console.log('==========================');
// console.log('删除失败'+error);
// console.log('==========================');
// });
//建立关系
// Message.belongsTo(User);
// Message.hasMany(Image);
//同步到数据库
// sequelize.sync({
// force: true,
// }).then(() => {
// console.log('==========================');
// console.log('同步成功');
// console.log('==========================');
// }).catch(() => {
// console.log('==========================');
// console.log('同步失败');
// console.log('==========================');
// });
//cudr
function addUers(name, age) {
User.create({
name: name,
age: age,
}).then((log) => {
log = JSON.stringify(log);
console.log('==========================');
console.log('增加用户成功' + log);
console.log('==========================');
}).catch((error) => {
console.log('==========================');
console.log('增加用户失败' + error);
console.log('==========================');
});
}
function addMessage(userId, text) {
Message.create({
text: text,
userId: userId,
}).then((log) => {
log = JSON.stringify(log);
console.log('==========================');
console.log('增加成功!' + log);
console.log('==========================');
}).catch((error) => {
console.log('==========================');
console.log('增加失败!' + error);
console.log('==========================');
});
}
function addImage(messageId, imageUrl) {
Image.create({
url: imageUrl,
messageId: messageId,
}).then((log) => {
log = JSON.stringify(log);
console.log('==========================');
console.log('添加图片成功' + log);
console.log('==========================');
}).catch((error) => {
console.log('==========================');
console.log('添加图片失败' + error);
console.log('==========================');
});
}
//测试
//addUers('杨雪娇',22);
//addMessage(2, '杨雪娇发来的消息3');
// addImage(5,'http://3.png');
// addImage(6,'http://4.png');
// addImage(2,'http://2.png');
// //
function getAllMessage() {
Message.findAll({
where: {
userId: 2
},
include: [
{
model: User,
attributes: [
'id',
'name',
],
},
{
model: Image,
attributes: [
'id',
'url'
]
}
],
}).then((result) => {
result = JSON.stringify(result);
console.log('==========================');
console.log(result);
console.log('==========================');
}).catch((error) => {
console.log('==========================');
console.log('查询失败' + error);
console.log('==========================');
});
}
//测试
//getAllMessage();
//删除消息
function delMessage(userId, messageId) {
Message.destroy({
where: {
userId: userId,
id: messageId,
},
}).then((log) => {
log = JSON.stringify(log);
console.log('==========================');
console.log('删除消息成功!' + log);
console.log('==========================');
}).catch((error) => {
console.log('==========================');
console.log('删除消息失败!' + error);
console.log('==========================');
});
}
//测试
//测试发现问题 如果不设置级联 则,从属message表的image表记录不会删除,而只是出现对应messageId 为NULL的现象
//delMessage(2,4);
const Role = sequelize.define('role', {
name: {
type: Sequelize.STRING, allowNull: true,
}
}, {
freezeTableName: true,
});
//对于单个模型的同步
// Role.sync().then((log) => {
// log = JSON.stringify(log);
// console.log('==========================');
// console.log('Role表数据同步成功' + log);
// console.log('==========================');
// Role.create({
// name: '管理员'
// }).then((log) => {
// log = JSON.stringify(log);
// console.log('==========================');
// console.log('添加的数据为' + log);
// console.log('==========================');
// }).catch((error) => {
// console.log('==========================');
// console.log('添加数据失败' + error);
// console.log('==========================');
// });
// }).catch((error) => {
// console.log('==========================');
// console.log('Role模型与表数据同步失败' + error);
// console.log('==========================');
// });
//定义User1模型
const User1 = sequelize.define('user1', {
name: {
type: Sequelize.STRING,
validate: {
notEmpty: true,
len: [2, 30],
}
},
age: {
type: Sequelize.STRING,
defaultValue: 21,
validate: {
isInt: {
msg: '年龄必须是整数!',
}
}
},
email: {
type: Sequelize.STRING,
validate: {
isEmail: true,
}
},
userpicture: Sequelize.STRING,
}, {
freezeTableName: true,
});
//
//同步User1模型
// User1.sync().then((log) => {
// log = JSON.stringify(log);
// console.log('==========================');
// console.log('User1表数据同步成功' + log);
// console.log('==========================');
// }).catch((error) => {
// console.log('==========================');
// console.log('User1模型与表数据同步失败' + error);
// console.log('==========================');
// });
function addUser1(userInfo) {
User1.create({
name: userInfo.name,
age:userInfo.age,
email:userInfo.email,
}).then((log) => {
log = JSON.stringify(log);
console.log('==========================');
console.log('添加的数据为' + log);
console.log('==========================');
}).catch((error) => {
console.log('==========================');
console.log('添加数据失败' + error);
console.log('==========================');
});
}
const userInfo={
name:'郭东生',
//age:0.1,//Validation error: 年龄必须是整数!
age:22,
email:'7758@qq.com',
//email:'7758',//Validation error: Validation isEmail on email failed
}
addUser1(userInfo);
以上关于Node.js ORM框架Sequlize之表间关系的介绍是小编分享的全部内容,希望能提供参考,也希望大家多多支持本站。