前言
大家都知道在使用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重新定义模型关系。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]