前言
大家都知道在使用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重新定义模型关系。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]