sequelize模型关联_关于Sequelize连接查询时inlude中model和association的区别详解

前言

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

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql设置表名字为占位符_这可能是把MySQL存储引擎讲解的最清楚的一篇文章了

存储引擎是MySQL的组件,用于处理不同表类型的SQL操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。使用哪一种引擎可以灵活选择,一个数据库中多个表可以使用不同引擎…

linux开发板显示横向彩虹,给 Linux 终端的输出添加彩虹特效的命令

原标题:给 Linux 终端的输出添加彩虹特效的命令正文如果认为Linux命令行很无聊并且没有任何乐趣,那么您错了,真实的Linux多么有趣和淘气。在本文,我将介绍一个名为“ lolcat ”的实用小工具,该实用工具在终端中产生彩虹…

Delphi 与 DirectX 之 DelphiX(46): TDIB.DoAntiAlias;

本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, DIB, StdCtrls;typeTForm1 class(TForm)DXPaintBox1: TDXPaintBox;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: T…

Web API实现微信公众平台开发-服务器验证

背景最近开发微信公众号相关接口,在这里记录下微信公众号相关各项功能的实现。先决条件1、一台可部署web服务的服务器或者云平台(本地可以搞个花生壳域名)。2、一个可以正常使用的微信公众账号,开始的时候使用它的测试号。3、Visu…

每天20分钟,只需一年,一年级学生英语听力达到六年级水平!关键是坚持一点都不难!

导读: 除了语文数学这种常规科目,最让家长们焦虑的就是英语。现在的孩子,英语启蒙都很早,但是对英语的兴趣总是开始还可以,越往后越没动力和兴趣,稍微遇到点挫折就不想坚持了。钱也花了,好老师也…

python爬取论坛付费内容_Python爬虫抓取论坛关键字过程解析

前言: 之前学习了用python爬虫的基本知识,现在计划用爬虫去做一些实际的数据统计功能。由于前段时间演员的诞生带火了几个年轻的实力派演员,想用爬虫程序搜索某论坛中对于某些演员的讨论热度,并按照日期统计每天的讨论量。 这个项…

pygame里面物体闪烁运动_Pygame-游戏中的运动

本来,在上一次pygame的教程中,我只是顺手拿了微信“打飞机”里的图来演示用鼠标控制图片位置的操作。后来觉得,这个游戏还算比较适合用来做例子,也有朋友反馈说想做这个游戏,那不如就以“打飞机”为例来说python游戏开…

定义一个1 1=11 用c语言什么输出来,问题 A: C语言11.1(示例代码)

问题 A: C语言11.1时间限制: 1 Sec 内存限制: 32 MB献花: 265 解决: 228[献花][花圈][TK题库]题目描述完成一个对候选人得票的统计程序。假设有3个候选人,名字分别为Li,Zhang和Fun。使用结构体存储每一个候选人的名字和得票数。记录每一张选票的得票人…

相对完善的Java通过JDBC操纵mysql的例子

工具类: Code1import java.sql.Connection; 2import java.sql.DriverManager; 3import java.sql.ResultSet; 4import java.sql.SQLException; 5import java.sql.Statement; 6 7 8public final class JDBCUtils { 910 private JDBCUtils(){}11 12 private static Strin…

如何在 ASP.Net Core 中使用 File Providers

ASP.Net Core 为了便于获取文件和文件夹信息,监视文件变更, 在文件系统中提供了一个抽象层:File Providers, 这篇文章将会讨论如何使用 File Providers 。File Provider 抽象层 file prodivers 实现了 IFileProvider 接口&#xf…

2020年python2停止更新_Python核心团队计划2020年停止支持Python2,NumPy宣布停止支持计划表...

Python核心团队计划在2020年停止支持Python 2。NumPy项目自2010年以来一直支持Python 2和Python 3,并且发现支持Python 2对我们有限的资源增加了负担;因此,我们最终计划将停止支持Python 2。现在,我们已经进入了社区支持的Python …

对5种主流编程语言的吐槽

不可否认,想要成为一名优秀的程序员确实是需要掌握多种编程语言。通过这几年的自虐式学习,小编也慢慢的掌握了这些编程语言。接下来要为大家,介绍五款让人又爱又恨的编程语言! 1.C 语言 C 语言给人的感觉,就是一位神秘…

python自动化测试脚本怎么编写_编写自动化测试脚本心得---菜鸟入门篇

编写自动化测试脚本心得 -------- 菜鸟入门篇 本文中将不会讲解 ISEE 的测试原理、不说明 Python 的常用语法、不介绍 OTP 测试平 台的架构, 自动化测试组的牛人们已经为我们编写了很多这些方面的资料, 而且我也怕学艺 不精说的不对, 因为 ……

c语言修改windows系统时间,c语言实现系统时间校正工具代码分享

//*******************************************************************//Time Protocol是一种非常简单的应用层协议。它返回一个未格式化的32位二进制数字,//这个数字描述了从1900年1月1日午夜到现在的秒数。服务器在端口37监听协议请求,以//TCP/IP或者UDP/IP格式…

WM中的OutLook开发和操作

昨天闲来无视,学习了一下WM的基本开发。看WM有约的那套教程心里痒痒,于是下载了SDK,看看DEMO,在Sample中的示例进行加工。小有一点心得。其实总的来说难度也不是很大,以前没有做过FORM的程序,都是WEB上面的…

苹果手机运行python_iPhone是卖的最好的手机?用Python照样把他玩弄鼓掌之间!

关于 iOS 的技术解读有很多,但是却鲜有设备可视化同步的介绍文章。本文一起了解下这个酷炫的 iOS 黑科技。我们的任务很简单——如上图所示,实时获取设备的当前方向。 UIDevice.current.orientation 首先,需要调用 beginGeneratingDeviceOrie…

这几个动图告诉你科学的神奇,看完瞬间觉得智商都提高了

生活中简单平常的事物和现象背后,往往有着奇妙的原理,赶快跟着一起来看看涨点知识吧! 夹心雪糕的制作原理 ▼ 难怪雪糕大小,厚度都一模一样 原来都是从一个模子里出来的 ▼ 煎饼可以统一翻面 再也不用担心烤焦了 ▼ 冰淇淋蛋筒的制…

自定义 ocelot 中间件输出自定义错误信息

自定义 ocelot 中间件输出自定义错误信息Introocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候就需要做一些自定义了,对 ocelot 中的 Response 中间件做了一些小改动,实现…

shapenet网络_GRNet网络:3D网格进行点云卷积,实现点云补全

Date:2020-11-23作者:三弟来源:GRNet网络:3D网格进行点云卷积,实现点云补全Gridding Residual Network for Dense Point Cloud Completion在点云分割方面,有一些方法尝试通过更通用的卷积操作来捕捉点云的空…

c语言随机数循环延迟,C语言生成随机数的函数、延时函数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼下面C语言代码使用了生成随机数的函数、延时函数。请大家仔细观察其显示效果。从以下代码,我们可以得出一个重要的结论:当上述两类函数被放入循环时,应作出一定修改。同时还应关注其参数的定义位…