关于 Sequelize 连接查询时 include 中 model 和 association 的区别,需要说明的如下:
1. 区别说明
1.1 model
在 Sequelize 中,include 方法可以用来进行关联查询,当使用 include 方法时,需要传入的第一个参数是指定关联的模型。这个参数可以是一个 Sequelize 模型的实例,也可以是一个字符串用来表示模型的名称,常用的是字符串表示法,即传入模型名称。例如:
const User = sequelize.define('user', { /* ... */ });
const Project = sequelize.define('project', { /* ... */ });
// 定义关联
Project.belongsTo(User);
// 查询时关联 User 模型
Project.findAll({
include: [
{ model: User }
]
});
这里 include 中指定的 model 是 User,表示要查询 Project 表,并在查询结果中把关联的 User 表中的相关信息一并查询出来。
1.2 association
association 是指在 Sequelize 中定义模型之间关联关系的方法,也就是在模型之间明确关系,是关联查询的必须条件。例如:
// 定义关联
Project.belongsTo(User);
// 执行关联查询
Project.findAll({ include: [ User ] });
这里 Project.belongsTo(User) 是定义了 Project 和 User 之间的关联,其中 Project 表中有外键 user_id 关联到 User 表的 id 字段。在 include 语句中指定了 User,表示在查询 Project 表时一并把 User 表中的相关信息查询出来。
2. 示例说明
以下是两个基于 Sequelize 的示例,以进一步说明 include 中 model 和 association 的区别。
2.1 示例一
假定现在有一个博客系统,博客文章内容以及评论都存在 MySQL 数据库中。其中博客文章主体信息存储在 posts 表中,评论信息存储在 comments 表中。评论表中有外键 post_id 关联到主表中的 id 字段,表示一篇文章有多条评论。在这个场景下,如果需要查询某篇文章及其所有评论的话,可以使用 Sequelize 中的 include 方法:
// 定义博客文章模型
const Post = sequelize.define('post',{
title: Sequelize.TEXT,
content: Sequelize.TEXT
});
// 定义评论模型
const Comment = sequelize.define('comment',{
content: Sequelize.TEXT
});
// 定义关联关系
Post.hasMany(Comment);
// 查询文章及其所有评论
Post.findAll({
where:{
id: 1
},
include: [{
model: Comment
}]
}).then(post=> {
console.log(post);
});
上述示例中,include 中指定的 model 是 Comment,表示要查询与博客文章相关的评论表信息。而 Post.hasMany(Comment) 定义了两个表间的关联关系,表示一篇文章可以有多个评论。
2.2 示例二
在某些情况下,一个模型可能与另外一个模型存在多种关联关系。例如,假如有一个系统需要根据模块 ID 获取对应的权限信息。在 Sequelize 中,可以使用多种方法来定义这种关联关系。例如:
// 定义模块模型
const Module = sequelize.define('module',{
name: Sequelize.TEXT
});
// 定义权限模型
const Permission = sequelize.define('permission',{
name: Sequelize.TEXT,
code: Sequelize.TEXT
});
// 定义模块和权限之间的关联关系
Module.belongsToMany(Permission, {through: 'module_permission'});
Permission.belongsToMany(Module, {through: 'module_permission'});
// 查询指定模块下的权限信息
Module.findOne({
where:{
id: 1
},
include: [{
model: Permission,
through: {attributes: ['code']}
}]
}).then(module=> {
console.log(module);
});
在上述示例中,Module.belongsToMany(Permission,{through: 'module_permission'}) 和 Permission.belongsToMany(Module,{through: 'module_permission'}) 定义了模块模型与权限模型之间的多对多关联关系。include 中的模型是 Permission,attributes 中指定了要查询的字段,表示查询与指定模块相关的权限信息。
3. 总结
在 Sequelize 中,include 方法用于进行关联查询,在传入 include 方法时可以指定相关的模型。association 则是用于定义模型之间的关联关系,是关联查询的必要条件。在实际使用中,需要根据需求选择使用 model 或是 association。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Sequelize连接查询时inlude中model和association的区别详解 - Python技术站