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

xiaoxiao2021-02-28  24

原文:http://www.jb51.net/article/106782.htm

前言

大家都知道在使用Sequelize进行关系模型(表)间连接查询时,我们会通过model/as来指定已存在关联关系的连接查询模型,或是通过association来直接指定连接查询模型关系。那么,两者各应该在什么场景下使用呢?

一、 示例准备

模型定义

首先,定义User和Company两个模型:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 '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关系。

插入数据

接下来基于刚定义的关系模型插入一些测试数据:

? 1 2 3 4 5 6 7 8 9 10 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模型中查询一个用户,并查询该用户所在的公司信息:

? 1 2 3 4 5 6 7 8 9 var include = [{   model: Company,   as: 'company' }]; User.findOne({include:include}).then((result) => {   console.log(result.name + ' 是 ' +result.company.name+ ' 的员工' ); }). catch ((err) => {   console.error(err); });

查询结果如下:

? 1 何民三 是 某公司 的员工

三、使用association

连接查询时,如果要连接查询的两个模型间事先没有定义连接关系,或者要使用定义之外的连接关系。这时,可以通过association来定义或重新定义模型关系。

如,查询Company模型中的任意一个公司,并查询该公司的管理员:

? 1 2 3 4 5 6 7 8 9 10 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选项中指定连接查询时所要使用的关联关系。

查询结果如下:

? 1 某公司 的管理员是 何民三

association除了用于指定之前没有定义的模型关系,还可以用于重新用于定义模型关系。如,假设我们通过hasMany事先定义了Company-User之间存在1:N的关系。这种关系适用于查询公司下的所有员工。而上例中,我们需要通过1:1关系来查公司的管理员,因此,这时可以通过association重新定义模型关系。

总结

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

转载请注明原文地址: https://www.6miu.com/read-1699992.html

最新回复(0)