Sequelize V6.20.1 MVC模式(五 | 一對多)

大家可以前往 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)系:多對多

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市三痰,隨后出現(xiàn)的幾起案子吧寺,更是在濱河造成了極大的恐慌,老刑警劉巖散劫,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚机,死亡現(xiàn)場離奇詭異,居然都是意外死亡获搏,警方通過查閱死者的電腦和手機(jī)赖条,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門失乾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纬乍,你說我怎么就攤上這事碱茁。” “怎么了仿贬?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵纽竣,是天一觀的道長。 經(jīng)常有香客問我茧泪,道長蜓氨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任队伟,我火速辦了婚禮穴吹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗜侮。我一直安慰自己港令,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布锈颗。 她就那樣靜靜地躺著顷霹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪击吱。 梳的紋絲不亂的頭發(fā)上泼返,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音姨拥,去河邊找鬼。 笑死渠鸽,一個胖子當(dāng)著我的面吹牛叫乌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徽缚,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憨奸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凿试?” 一聲冷哼從身側(cè)響起排宰,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎那婉,沒想到半個月后板甘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡详炬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年盐类,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡在跳,死狀恐怖枪萄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猫妙,我是刑警寧澤瓷翻,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站割坠,受9級特大地震影響齐帚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韭脊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一童谒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沪羔,春花似錦饥伊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至篓吁,卻和暖如春茫因,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杖剪。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工冻押, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盛嘿。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓洛巢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親次兆。 傳聞我的和親對象是個殘疾皇子稿茉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354