关于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 相关文章推荐
新增加的内容是如何将div的scrollbar自动移动最下面
Jan 02 Javascript
浅谈node.js中async异步编程
Oct 22 Javascript
js完整倒计时代码分享
Sep 18 Javascript
js 获取本地文件及目录的方法(推荐)
Nov 10 Javascript
Angular.JS中的this指向详解
May 17 Javascript
ES6 javascript中Class类继承用法实例详解
Oct 30 Javascript
微信小程序实现简单input正则表达式验证功能示例
Nov 30 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
微信小程序自定义多选事件的实现代码
May 17 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
Aug 13 jQuery
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
详解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之Smarty入门
2007/01/04 PHP
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
jquery异步循环获取功能实现代码
2010/09/19 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
基于jquery实现智能表单验证操作
2016/05/09 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
python实现爬虫下载美女图片
2015/07/14 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
python 实现两个npy档案合并
2020/07/01 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
关于十八大的演讲稿
2014/09/15 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
安全员岗位职责
2015/02/10 职场文书
安全承诺书格式范本
2015/04/28 职场文书
优秀毕业生主要事迹材料
2015/11/04 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
我的收音机情缘
2022/04/05 无线电
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers