日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

sequelize模型关联_关于Sequelize连接查询时inlude中model和association的区别详解

發(fā)布時(shí)間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sequelize模型关联_关于Sequelize连接查询时inlude中model和association的区别详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

大家都知道在使用Sequelize進(jìn)行關(guān)系模型(表)間連接查詢(xún)時(shí),我們會(huì)通過(guò)model/as來(lái)指定已存在關(guān)聯(lián)關(guān)系的連接查詢(xún)模型,或是通過(guò)association來(lái)直接指定連接查詢(xún)模型關(guān)系。那么,兩者各應(yīng)該在什么場(chǎng)景下使用呢?

一、?示例準(zhǔn)備

模型定義

首先,定義User和Company兩個(gè)模型:

'use strict'

const Sequelize = require('sequelize');

// 創(chuàng)建 sequelize 實(shí)例

const sequelize = new Sequelize('db1', 'root', '111111', {logging: console.log});

// 定義User模型

var User = sequelize.define('user', {

id:{type: Sequelize.BIGINT(11), autoIncrement:true, primaryKey : true, unique : true},

name: { type: Sequelize.STRING, comment:'姓名' },

sex: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment:'性別' },

companyId: { type: Sequelize.BIGINT(11), field: 'company_id', allowNull: false, comment:'所屬公司' },

isManager: { type: Sequelize.BOOLEAN, field: 'is_manager', allowNull: false, defaultValue: false, comment:'是否管理員'}

},

{ charset: 'utf8',

collate: 'utf8_general_ci'});

// 定義Company模型

var Company = sequelize.define('company', {

id:{ type:Sequelize.BIGINT(11), autoIncrement:true, primaryKey : true, unique : true},

name: { type: Sequelize.STRING, comment:'公司名稱(chēng)' }

},

{ charset: 'utf8',

collate: 'utf8_general_ci'});

// 定義User-Company關(guān)聯(lián)關(guān)系

User.belongsTo(Company, {foreignKey:'companyId'});

// sequelize.sync({force:true}).then(() => {

// process.exit();

// });

如上所示,我們定義了User和Company兩個(gè)模型,并通過(guò)belongsTo指定了User-Company之間為1:1關(guān)系。

插入數(shù)據(jù)

接下來(lái)基于剛定義的關(guān)系模型插入一些測(cè)試數(shù)據(jù):

Company.create({name:'某公司'}).then((result) => {

return Promise.all([

User.create({name:'何民三', sex:1, companyId:result.id, isManager: true}),

User.create({name:'張老二', sex:1, companyId:result.id})

])

}).then((result) => {

console.log('done');

}).catch((err) => {

console.error(err);

});

二、使用model/as

在進(jìn)行連接查詢(xún)時(shí),如果已經(jīng)定義模型間的關(guān)聯(lián)關(guān)系。就可以在inlude查詢(xún)選項(xiàng)中,通過(guò)'model'屬性指定要連接查詢(xún)的模型,還可以通過(guò)'as'屬性指定別名。

如,從User模型中查詢(xún)一個(gè)用戶(hù),并查詢(xún)?cè)撚脩?hù)所在的公司信息:

var include = [{

model: Company,

as: 'company'

}];

User.findOne({include:include}).then((result) => {

console.log(result.name + ' 是 '+result.company.name+' 的員工');

}).catch((err) => {

console.error(err);

});

查詢(xún)結(jié)果如下:

何民三 是 某公司 的員工

三、使用association

連接查詢(xún)時(shí),如果要連接查詢(xún)的兩個(gè)模型間事先沒(méi)有定義連接關(guān)系,或者要使用定義之外的連接關(guān)系。這時(shí),可以通過(guò)association來(lái)定義或重新定義模型關(guān)系。

如,查詢(xún)Company模型中的任意一個(gè)公司,并查詢(xún)?cè)摴镜墓芾韱T:

var include = [{

association: Company.hasOne(User, {foreignKey:'companyId', as:'manager'}),

where: {isManager:true}

}]

Company.findOne({include:include}).then((result) => {

console.log(result.name +' 的管理員是 ' +result.manager.name);

}).catch((err) => {

console.error(err);

});

由于Company-User之間并沒(méi)有事先定義模型關(guān)系,因此需要在inlude選項(xiàng)中指定連接查詢(xún)時(shí)所要使用的關(guān)聯(lián)關(guān)系。

查詢(xún)結(jié)果如下:

某公司 的管理員是 何民三

association除了用于指定之前沒(méi)有定義的模型關(guān)系,還可以用于重新用于定義模型關(guān)系。如,假設(shè)我們通過(guò)hasMany事先定義了Company-User之間存在1:N的關(guān)系。這種關(guān)系適用于查詢(xún)公司下的所有員工。而上例中,我們需要通過(guò)1:1關(guān)系來(lái)查公司的管理員,因此,這時(shí)可以通過(guò)association重新定義模型關(guān)系。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

總結(jié)

以上是生活随笔為你收集整理的sequelize模型关联_关于Sequelize连接查询时inlude中model和association的区别详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。