亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于Sequelize連接查詢時inlude中model和association的區別詳解

發布時間:2020-10-12 23:04:18 來源:腳本之家 閱讀:143 作者:IT筆錄 欄目:web開發

前言

大家都知道在使用Sequelize進行關系模型(表)間連接查詢時,我們會通過model/as來指定已存在關聯關系的連接查詢模型,或是通過association來直接指定連接查詢模型關系。那么,兩者各應該在什么場景下使用呢?

一、 示例準備

模型定義

首先,定義User和Company兩個模型:

'use strict'

const Sequelize = require('sequelize');

// 創建 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關聯關系
User.belongsTo(Company, {foreignKey:'companyId'});

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

如上所示,我們定義了User和Company兩個模型,并通過belongsTo指定了User-Company之間為1:1關系。

插入數據

接下來基于剛定義的關系模型插入一些測試數據:

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

在進行連接查詢時,如果已經定義模型間的關聯關系。就可以在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);
});

查詢結果如下:

何民三 是 某公司 的員工

三、使用association

連接查詢時,如果要連接查詢的兩個模型間事先沒有定義連接關系,或者要使用定義之外的連接關系。這時,可以通過association來定義或重新定義模型關系。

如,查詢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之間并沒有事先定義模型關系,因此需要在inlude選項中指定連接查詢時所要使用的關聯關系。

查詢結果如下:

某公司 的管理員是 何民三

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴东县| 长汀县| 肇东市| 镇雄县| 信宜市| 陵川县| 晋州市| 酉阳| 浏阳市| 巧家县| 绥芬河市| 永昌县| 女性| 巴青县| 象州县| 潞城市| 香格里拉县| 焉耆| 广安市| 高阳县| 新巴尔虎右旗| 弥渡县| 四子王旗| 辽源市| 辽宁省| 宝清县| 海盐县| 桐城市| 柳河县| 正蓝旗| 本溪| 金昌市| 田阳县| 株洲市| 新巴尔虎左旗| 潞城市| 会泽县| 青州市| 岫岩| 内乡县| 甘肃省|