sequelize模型关联_关于Sequelize连接查询时inlude中model和association的区别详解
前言
大家都知道在使用Sequelize進(jìn)行關(guān)系模型(表)間連接查詢時,我們會通過model/as來指定已存在關(guān)聯(lián)關(guān)系的連接查詢模型,或是通過association來直接指定連接查詢模型關(guān)系。那么,兩者各應(yīng)該在什么場景下使用呢?
一、?示例準(zhǔn)備
模型定義
首先,定義User和Company兩個模型:
'use strict'
const Sequelize = require('sequelize');
// 創(chuàng)建 sequelize 實例
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:'公司名稱' }
},
{ 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兩個模型,并通過belongsTo指定了User-Company之間為1:1關(guān)系。
插入數(shù)據(jù)
接下來基于剛定義的關(guān)系模型插入一些測試數(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)行連接查詢時,如果已經(jīng)定義模型間的關(guān)聯(lián)關(guān)系。就可以在inlude查詢選項中,通過'model'屬性指定要連接查詢的模型,還可以通過'as'屬性指定別名。
如,從User模型中查詢一個用戶,并查詢該用戶所在的公司信息:
var include = [{
model: Company,
as: 'company'
}];
User.findOne({include:include}).then((result) => {
console.log(result.name + ' 是 '+result.company.name+' 的員工');
}).catch((err) => {
console.error(err);
});
查詢結(jié)果如下:
何民三 是 某公司 的員工
三、使用association
連接查詢時,如果要連接查詢的兩個模型間事先沒有定義連接關(guān)系,或者要使用定義之外的連接關(guān)系。這時,可以通過association來定義或重新定義模型關(guān)系。
如,查詢Company模型中的任意一個公司,并查詢該公司的管理員:
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之間并沒有事先定義模型關(guān)系,因此需要在inlude選項中指定連接查詢時所要使用的關(guān)聯(lián)關(guān)系。
查詢結(jié)果如下:
某公司 的管理員是 何民三
association除了用于指定之前沒有定義的模型關(guān)系,還可以用于重新用于定義模型關(guān)系。如,假設(shè)我們通過hasMany事先定義了Company-User之間存在1:N的關(guān)系。這種關(guān)系適用于查詢公司下的所有員工。而上例中,我們需要通過1:1關(guān)系來查公司的管理員,因此,這時可以通過association重新定義模型關(guān)系。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
總結(jié)
以上是生活随笔為你收集整理的sequelize模型关联_关于Sequelize连接查询时inlude中model和association的区别详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017杭州云栖大会展商一览表
- 下一篇: 如何给苹果iPhone手机中的软件上锁