大家可以前往 Sequelize中文文檔馆里,查看 Sequelize不同版本【5.x剧包、4.x】的文檔
本文檔分多個(gè)篇章晤揣,難易程度從低到高童社,學(xué)習(xí)此篇章之前,務(wù)必確保自己已經(jīng)掌握 node.js柬唯、express揭北、es6語(yǔ)法、mysql等關(guān)系型數(shù)據(jù)庫(kù)的sql語(yǔ)法等
一對(duì)一
以下例子可能不恰當(dāng)之碗,但是不要較真蝙眶,跟著思路走就對(duì)了。
舉個(gè)栗子: 假設(shè)一個(gè)人(id)只能有一個(gè)愛(ài)好褪那,而一個(gè)愛(ài)好(id)也只能對(duì)應(yīng)一個(gè)人幽纷,那么這種模式就是一對(duì)一
模型定義
我這里為了方便理解就不把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í)例對(duì)象將擁有g(shù)etHobby、setHobby博敬、createHobby方法
User.hasOne(Hobby);
//Hobby的實(shí)例對(duì)象將擁有g(shù)etUser友浸、setUser、createUser方法
Hobby.belongsTo(User);
User.sync({force: true}).then(d=> {//創(chuàng)建完成之后注釋掉此段
console.log('users表同步完成');
Hobby.sync({force: true}).then(d=> {
console.log('Hobby表同步完成');
});
});
export default {User,Hobby}
關(guān)系操作
增加數(shù)據(jù)
客戶(hù)端傳來(lái)
username
hobbyName
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
})
}
postman
{
"code": 200,
"hobby": {
"id": 4,
"hobbyName": "rap",
"userId": 18,
"updatedAt": "2019-07-10T04:12:50.770Z",
"createdAt": "2019-07-10T04:12:50.770Z"
}
}
修改數(shù)據(jù)
通過(guò)用戶(hù)id偏窝,修改關(guān)聯(lián)的hobbyName
User.Controller.js
updateUserHobby: async (req, res, next)=>{
let {id, hobbyName} = req.body;
let user = await User.User.findOne({where: {id}});//通過(guò)id查詢(xún)用戶(hù)
let upHobby = await User.Hobby.create({hobbyName});//在hobbys表中創(chuàng)建一條數(shù)據(jù)
let updateHobby = await user.setHobby(upHobby);//找出當(dāng)前user所關(guān)聯(lián)的hobbyName并將其userId置為null(為了保證一對(duì)一關(guān)系)收恢,然后設(shè)置當(dāng)前插入的數(shù)據(jù)的userId為當(dāng)前的用戶(hù)id
res.send({
code: 200,
data: '修改成功',
updateHobby
})
}
數(shù)據(jù)庫(kù)
postman
{
"code": 200,
"data": "修改成功",
"updateHobby": {
"id": 6,
"hobbyName": "唱跳rap",
"updatedAt": "2019-07-10T04:23:19.565Z",
"createdAt": "2019-07-10T04:23:19.537Z",
"userId": 18
}
}
刪除數(shù)據(jù)
通過(guò)用戶(hù)id刪除對(duì)應(yīng)的hobby
實(shí)際上是清空綁定武学,將userId設(shè)置為Null
User.Controller.js
deleteUserHobby: async (req, res, next)=>{
let {id} = req.body;
let user = await User.User.findOne({where: {id}});//通過(guò)id查詢(xún)用戶(hù)
let deleteHobby = await user.setHobby(null);
res.send({
code: 200,
data: '刪除成功',
deleteHobby
})
}
postman
{
"code": 200,
"data": "刪除成功",
"deleteHobby": null
}
查找數(shù)據(jù)
查詢(xún)用戶(hù)所對(duì)應(yīng)的hobby,只返回hobby
User.Controller.js
getHobby: async (req, res, next)=>{
let {id} = req.query;
let user = await User.User.findOne({where: {id}});//通過(guò)id查詢(xún)用戶(hù)
let hobby = await user.getHobby();
res.send({
code: 200,
hobby
})
}
postman
{
"code": 200,
"hobby": {
"id": 7,
"hobbyName": "唱跳rap",
"createdAt": "2019-07-10T04:37:23.000Z",
"updatedAt": "2019-07-10T04:37:23.000Z",
"userId": 18
}
}
查詢(xún)用戶(hù)所對(duì)應(yīng)的hobby派诬,user和對(duì)應(yīng)的hobby一同返回
User.Controller.js
getUserAndHobby: async (req, res, next)=>{
let {id} = req.query;
let userAndHobby = await User.User.findByPk(id,{
include: [User.Hobby],
attributes: ['id', 'username', 'age']
});
res.send({
code: 200,
userAndHobby
})
}
postman
{
"code": 200,
"userAndHobby": {
"id": 18,
"username": "Anmy",
"age": 20,
"hobby": {
"id": 7,
"hobbyName": "唱跳rap",
"createdAt": "2019-07-10T04:37:23.000Z",
"updatedAt": "2019-07-10T04:37:23.000Z",
"userId": 18
}
}
}
好了劳淆,到此為止,一對(duì)一的關(guān)系就已經(jīng)結(jié)束了默赂,下一章節(jié)我們會(huì)介紹 [Sequelize V6.20.1 中數(shù)據(jù)表的關(guān)系:一對(duì)多