关于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实现查找字符串中第一个不重复的字符
Dec 29 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
May 20 Javascript
Angular4表单验证代码详解
Sep 03 Javascript
Vue.js搭建移动端购物车界面
Jun 28 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
Dec 22 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 Javascript
vue-cli初始化项目中使用less的方法
Aug 09 Javascript
用js简单提供增删改查接口
May 12 Javascript
ES6 Promise对象的应用实例分析
Jun 27 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
Vue实现购物车实例代码两则
May 30 Javascript
吃通javascript正则表达式
Apr 21 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中一个有意思的日期逻辑处理
2012/03/25 PHP
php读取纯真ip数据库使用示例
2014/01/26 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
jquery 输入框数字限制插件
2009/11/10 Javascript
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
javascript求日期差的方法
2016/03/02 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
2017/02/14 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
PyTorch基本数据类型(一)
2019/05/22 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
用python解压分析jar包实例
2020/01/16 Python
学会python自动收发邮件 代替你问候女友
2020/05/20 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
拉丁舞学习者的自我评价
2013/10/27 职场文书
物业电工岗位职责
2013/11/20 职场文书
执行力心得体会
2013/12/31 职场文书
车间统计员岗位职责
2014/01/05 职场文书
交通安全演讲稿
2014/01/07 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
会计学自我鉴定
2014/02/06 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
汽车销售员工作总结
2015/08/12 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python
Python机器学习应用之基于线性判别模型的分类篇详解
2022/01/18 Python