关于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中substr,substring,slice.splice的区别说明
Nov 25 Javascript
js取消单选按钮选中并判断对象是否为空
Nov 14 Javascript
Jquery弹出层插件ThickBox的使用方法
Dec 09 Javascript
JavaScript将一个数组插入到另一个数组的方法
Mar 19 Javascript
JS实现动态给图片添加边框的方法
Apr 01 Javascript
jQuery事件绑定与解除绑定实现方法
Apr 15 Javascript
JS实现兼容性较好的随屏滚动效果
Nov 09 Javascript
js a标签点击事件
Mar 30 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 Javascript
微信小程序页面渲染实现方法
Nov 06 Javascript
详解vue-router的Import异步加载模块问题的解决方案
May 13 Javascript
JS的深浅复制详细
Oct 16 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代码优化及php相关问题总结
2006/10/09 PHP
我的论坛源代码(五)
2006/10/09 PHP
php桌面中心(二) 数据库写入
2007/03/11 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
2020/03/18 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
JavaScript 验证浏览器是否支持javascript的方法小结
2009/05/17 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
机器学习实战之knn算法pandas
2019/06/22 Python
Python 的AES加密与解密实现
2019/07/09 Python
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
益模软件Java笔试题
2012/03/27 面试题
信息技术教学反思
2014/02/12 职场文书
淘宝活动总结范文
2014/06/26 职场文书
承租经营合作者协议书
2014/10/01 职场文书
小学生读书笔记
2015/07/01 职场文书
篮球赛新闻稿
2015/07/17 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers
Python使用openpyxl模块处理Excel文件
2022/06/05 Python