关于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 相关文章推荐
有道JavaScript监听浏览器的问题
Jun 23 Javascript
使用javascript为网页增加夜间模式
Jan 26 Javascript
全面兼容的javascript时间格式化函数(比较实用)
May 14 Javascript
在Mac OS下使用Node.js的简单教程
Jun 24 Javascript
jQuery常用且重要方法汇总
Jul 13 Javascript
javascript计时器编写过程与实现方法
Feb 29 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
node通过npm写一个cli命令行工具
Oct 12 Javascript
基于Vuejs的搜索匹配功能实现方法
Mar 03 Javascript
vue组件详解之使用slot分发内容
Apr 09 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
Apr 20 Javascript
vue实现简单的MVVM框架
Aug 05 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数组中的索引数组和关联数组详解
2018/03/12 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
Jquery 常用方法经典总结
2010/01/28 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
JQuery和HTML5 Canvas实现弹幕效果
2017/01/04 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
js实现旋转木马效果
2017/03/17 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
Python中使用socks5设置全局代理的方法示例
2020/04/15 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
大专计算机个人求职的自我评价
2013/10/21 职场文书
船舶专业个人求职信范文
2014/01/02 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
培训讲师岗位职责
2014/04/13 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
环保主题班会教案
2015/08/13 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书