大家可以前往 Sequelize中文文檔,查看 Sequelize不同版本【5.x翘地、4.x】的文檔
本文檔分多個篇章,難易程度從低到高拦惋,學(xué)習(xí)此篇章之前,務(wù)必確保自己已經(jīng)掌握 node.js鸣哀、express架忌、es6語法、mysql等關(guān)系型數(shù)據(jù)庫的sql語法等
一對多
以下例子可能不恰當(dāng)我衬,但是不要較真叹放,跟著思路走就對了。
舉個栗子: 假設(shè)一個人(id)可以有多個愛好(id)挠羔,那么這種模式就是一對多
模型定義
我這里為了方便理解就不把hobbys表的模型拎出去了
import {Sequelize, DataTypes} from 'sequelize'
import sequelize from './../connection'
const User = sequelize.define('user', {
username: DataTypes.STRING,
gender: {
type: DataTypes.INTEGER,
defaultValue: 1,
},
age: {
type: DataTypes.INTEGER,
defaultValue: 20
},
headImg: {
type: DataTypes.STRING,
defaultValue: 'img.png'
}
});
const Hobby = sequelize.define('hobby',
{
hobbyName: {
type: DataTypes.CHAR(20),
allowNull: false
}
}
);
//User的實(shí)例對象將擁有g(shù)etHobby井仰、setHobby、addHobby破加、createHobby俱恶、removeHobby、hasHobby方法
let Hobbies = User.hasMany(Hobby, {as: 'Hobbies'});//讓user實(shí)例可以調(diào)用getHobbies 和 setHobbies
//Hobby的實(shí)例對象將擁有g(shù)etUser范舀、setUser合是、createUser方法
Hobby.belongsTo(User);
User.sync({force: true}).then(d=> {//表同步完成后注釋掉
console.log('users表同步完成');
Hobby.sync({force: true}).then(d=> {
console.log('Hobby表同步完成');
});
});
export default {User,Hobby,Hobbies}
關(guān)系操作
增加數(shù)據(jù)
方法一
User.Controller.js
insertUserHobby: async (req, res, next) => {
let {username, hobbyName} = req.body;
let user = await User.User.create({username});
let hobby = await user.createHobby({hobbyName});
res.send({
code: 200,
hobby
})
},
方法二
User.Controller.js
insertUserHobbies: async (req, res, next) => {
let {username, hobbyName} = req.body;
let user = await User.User.create({username});
let hobby1 = await User.Hobby.create({hobbyName});//插入一條hobby數(shù)據(jù),此時(shí)該條數(shù)據(jù)的外鍵userId為空
let hobby2 = await User.Hobby.create({hobbyName: '籃球'});//這里我就不接收了锭环,直接賦值了
hobby1 = await user.addHobby(hobby1);//使用user的屬性id值再更新該條hobby數(shù)據(jù)聪全,設(shè)置好外鍵,完成關(guān)系建立
hobby2 = await user.addHobby(hobby2);//新增多個愛好
res.send({
code: 200,
hobby1,hobby2
})
},
修改數(shù)據(jù)
User.Controller.js
updateUserHobbies: async (req, res, next)=>{
let {id, hobbyName} = req.body;
let user = await User.User.findOne({where: {id}});
let upHobby = await User.Hobby.create({hobbyName});
let upHobby2 = await User.Hobby.create({hobbyName: '愛好2'});
let updateHobby = await user.setHobbies([upHobby, upHobby2]);
res.send({
code: 200,
data: '修改成功',
updateHobby
})
},
修改數(shù)據(jù)
刪除數(shù)據(jù) 實(shí)際上是將關(guān)聯(lián)的userId設(shè)置為null
User.Controller.js
deleteUserHobbies: async (req, res, next)=>{
let {id} = req.body;
let user = await User.User.findOne({where: {id}});//通過id查詢用戶
let deleteHobby = await user.setHobbies([]);
res.send({
code: 200,
data: '刪除成功',
deleteHobby
})
},
查詢數(shù)據(jù)
查詢user的所有滿足條件的hobby數(shù)據(jù)辅辩。
User.Controller.js
getHobbies : async (req, res, next)=>{
let {id} = req.query;
let user = await User.User.findByPk(id);
let Hobbies = await user.getHobbies({
attributes: ['hobbyName','userId']
});
res.send({
code: 200,
hobbies
})
}
postman
{
"code": 200,
"hobbies": [
{
"hobbyName": "練習(xí)生",
"userId": 4
},
{
"hobbyName": "籃球",
"userId": 4
}
]
}
查詢所有滿足條件的hobby难礼,同時(shí)獲取hobby屬于哪個user。
User.Controller.js
getUserHobbies: async (req, res, next)=>{
let {id} = req.query;
let hobbies = await User.Hobby.findAll({
where: {userId: id},
include: [{
model: User.User,
attributes: ['username']
}],
attributes: ['hobbyName','userId']
});
res.send({code: 200, hobbies})
}
postman
{
"code": 200,
"hobbies": [
{
"hobbyName": "練習(xí)生",
"userId": 4,
"user": {
"username": "Mjhu"
}
},
{
"hobbyName": "籃球",
"userId": 4,
"user": {
"username": "Mjhu"
}
}
]
}
查詢所有滿足條件的user玫锋,同時(shí)獲取該user所有滿足條件的hobby蛾茉。
User.Controller.js
getUserInfo: async (req, res, next)=>{
let {id} = req.query;
let userAndHobbies = await User.User.findOne({
where: {id},
attributes: ['username','gender'],
include: [{
association: User.Hobbies,
attributes: ['hobbyName']
}]
});
res.send({code: 200, userAndHobbies})
}
postman
{
"code": 200,
"userAndHobbies": {
"username": "Mjhu",
"gender": 1,
"Hobbies": [
{
"hobbyName": "練習(xí)生"
},
{
"hobbyName": "籃球"
}
]
}
}
好了,到此為止撩鹿,一對多的關(guān)系就已經(jīng)結(jié)束了谦炬,下一章節(jié)我們會介紹 [Sequelize V6.20.1 中數(shù)據(jù)表的關(guān)系:多對多