关于Sequelize连接查询时inlude中model和association的区别详解

发布时间 - 2026-01-10 23:17:24    点击率:

前言

大家都知道在使用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重新定义模型关系。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# sequelize  # model  # include  # nodejs  # Node.js Sequelize如何实现数据库的读写分离  # Sequelize 常用操作详解及实例代码  # Sequelize中用group by进行分组聚合查询  # node.js Sequelize实现单实例字段或批量自增、自减  # 关联关系  # 还可以  # 可以通过  # 查询结果  # 大家都  # 该公司  # 适用于  # 公司名称  # 选项中  # 所示  # 这篇文章  # 谢谢大家  # 所要  # 而上  # 该用户  # 老二  # 要使  # 就可以  # 测试数据  # 有疑问 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何用搬瓦工VPS快速搭建个人网站?  轻松掌握MySQL函数中的last_insert_id()  制作企业网站建设方案,怎样建设一个公司网站?  Python函数文档自动校验_规范解析【教程】  黑客入侵网站服务器的常见手法有哪些?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  JS实现鼠标移上去显示图片或微信二维码  如何用y主机助手快速搭建网站?  如何在Windows 2008云服务器安全搭建网站?  iOS中将个别页面强制横屏其他页面竖屏  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  nginx修改上传文件大小限制的方法  iOS UIView常见属性方法小结  如何确保FTP站点访问权限与数据传输安全?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何在IIS中新建站点并解决端口绑定冲突?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Firefox Developer Edition开发者版本入口  香港服务器租用每月最低只需15元?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  ,怎么在广州志愿者网站注册?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  iOS发送验证码倒计时应用  如何在万网利用已有域名快速建站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  如何在阿里云通过域名搭建网站?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何在VPS电脑上快速搭建网站?  如何在腾讯云服务器上快速搭建个人网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何在Tomcat中配置并部署网站项目?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  如何在Windows服务器上快速搭建网站?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  linux top下的 minerd 木马清除方法  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  用yum安装MySQLdb模块的步骤方法  使用spring连接及操作mongodb3.0实例  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  高端建站三要素:定制模板、企业官网与响应式设计优化  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册