关于Sequelize连接查询时inlude中model和association的区别详解


Posted in Javascript onFebruary 27, 2017

前言

大家都知道在使用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重新定义模型关系。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Jqgrid设置全选(选择)及获取选择行的值示例代码
Dec 28 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
Jan 13 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
Aug 04 Javascript
详解Document.Cookie
Dec 25 Javascript
Bootstrap对话框使用实例讲解
Sep 24 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
Nov 28 Javascript
js实现文字列表无缝滚动效果
Jun 23 Javascript
jQuery实现的点击按钮改变样式功能示例
Jul 21 jQuery
记录一次完整的react hooks实践
Mar 11 Javascript
对vue中的事件穿透与禁止穿透实例详解
Oct 28 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
Apr 21 Javascript
js实现类选择器和name属性选择器的示例步骤
Feb 07 Javascript
详解Javascript几种跨域方式总结
Feb 27 #Javascript
JavaScript与JQUERY获取元素的宽、高和位置
Feb 26 #Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 #Javascript
浅谈JavaScript中的apply/call/bind和this的使用
Feb 26 #Javascript
JavaScript中Promise的使用详解
Feb 26 #Javascript
setTimeout函数的神奇使用
Feb 26 #Javascript
node.js入门学习之url模块
Feb 25 #Javascript
You might like
一个简单实现多条件查询的例子
2006/10/09 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
如何实现JS函数的重载
2006/09/22 Javascript
利用js对象弹出一个层
2008/03/26 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
javascript学习笔记(十七) 检测浏览器插件代码
2012/06/20 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
2013/08/13 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
JavaScript mixin实现多继承的方法详解
2017/03/30 Javascript
微信扫码支付零云插件版实例详解
2017/04/26 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
解决antd 下拉框 input [defaultValue] 的值的问题
2020/10/31 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
Python Pillow Image Invert
2019/01/22 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Python栈的实现方法示例【列表、单链表】
2020/02/22 Python
CSS3中Transform动画属性用法详解
2016/07/04 HTML / CSS
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
古驰英国官网:GUCCI英国
2020/03/07 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
Servlet面试题库
2015/07/18 面试题
思想政治自我鉴定
2013/10/06 职场文书
职高毕业生自我鉴定
2013/10/21 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
2014年秘书工作总结
2014/11/25 职场文书
vue elementUI批量上传文件
2022/04/26 Vue.js
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL