关于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 相关文章推荐
jquery获取特定name所有选中的checkbox,支持IE9标准模式
Mar 18 Javascript
JS二维数组的定义说明
Mar 03 Javascript
JQuery1.8 判断元素是否绑定事件的方法
Jul 10 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
Jul 18 Javascript
JavaScript的arguments对象应用示例
Sep 15 Javascript
js中substring和substr两者区别和使用方法
Nov 09 Javascript
JavaScript观察者模式(经典)
Dec 09 Javascript
Select下拉框模糊查询功能实现代码
Jul 22 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
Sep 26 Javascript
微信小程序如何获取手机验证码
Nov 04 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 Javascript
在vue中实现嵌套页面(iframe)
Jul 30 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
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
微信支付开发告警通知实例
2016/07/12 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
JavaScript 学习笔记(六)
2009/12/31 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
BootStrap模态框不垂直居中的解决方法
2017/10/19 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
python分割和拼接字符串
2013/11/01 Python
在Python的Django框架中创建和使用模版
2015/07/15 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
详解python持久化文件读写
2019/04/06 Python
Python tkinter三种布局实例详解
2020/01/06 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
毕业自荐书
2013/12/09 职场文书
支教自我鉴定
2014/01/18 职场文书
股权转让协议书
2014/04/12 职场文书
委托书范本
2014/09/13 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
2015年大学生实习评语
2015/03/25 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript