首頁 >web前端 >js教程 >Sequelize連接查詢時inlude中model和association的區別

Sequelize連接查詢時inlude中model和association的區別

高洛峰
高洛峰原創
2017-02-28 14:32:562026瀏覽

前言

大家都知道在使用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重新定義模型關係。

更多Sequelize連接查詢時inlude中model和association的區別相關文章請關注PHP中文網!


#
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn