关于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 25 Javascript
Jquery中对数组的操作代码
Aug 12 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
Feb 26 Javascript
jquery实现瀑布流效果分享
Mar 26 Javascript
利用jquery制作滚动到指定位置触发动画
Mar 26 Javascript
使用jQuery实现Web页面换肤功能的要点解析
May 12 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
Jul 28 Javascript
Vue.js计算属性computed与watch(5)
Dec 09 Javascript
JavaScript中String对象的方法介绍
Jan 04 Javascript
微信小程序实现保存图片到相册功能
Nov 30 Javascript
jQuery实现简易聊天框
Feb 08 jQuery
vue路由切换时取消之前的所有请求操作
Sep 01 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
在PHP中利用XML技术构造远程服务(上)
2006/10/09 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
2010/11/05 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
JavaScript用200行代码制作打飞机小游戏实例
2017/06/21 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
vue用addRoutes实现动态路由的示例
2017/09/15 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
Python类的用法实例浅析
2015/05/27 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
Python基于百度云文字识别API
2018/12/13 Python
使用Python的turtle模块画国旗
2019/09/24 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
Python爬虫教程知识点总结
2020/10/19 Python
个人找工作自荐信格式
2013/09/21 职场文书
关于逃课的检讨书
2014/01/23 职场文书
员工安全生产承诺书
2014/05/22 职场文书
新学期开学演讲稿
2014/05/24 职场文书
青年文明号口号
2014/06/17 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技
防止web项目中的SQL注入
2021/12/06 MySQL