在使用 Node.js 中的 Sequelize 进行数据库操作时,我们经常需要在表之间建立关联。Sequelize 提供了多种方法来创建关联表,本文将详细讲解这些方法以及其相关内容。
一、关联类型
在开始创建关联表之前,我们需要了解关联类型。Sequelize 支持以下 4 中关联类型:
- 一对一(hasOne)
- 一对多(hasMany)
- 多对一(belongsTo)
- 多对多(belongsToMany)
理解好这些关联类型可以帮助我们更方便地选择适合的创建方式。
二、创建关联
1. 一对一关联(hasOne)
一对一关联通常用于将两个表具有唯一对应关系的情况。比如,在用户表中,每一个用户只有一个详细信息表,可以使用 hasOne
来建立这样的关系。
在 Sequelize 中,可以通过 hasOne
方法将两个表关联起来。下面是一个示例代码:
// User 为主表,Detail 为关联表 User.hasOne(Detail); // 或者 User.hasOne(Detail, { foreignKey: 'userId' });
上面代码中,我们在 User
模型中使用 hasOne
方法,表示一个用户只有一个详细信息表,该方法的第一个参数表示需要关联的表。我们还可以通过第二个参数传递一个对象,该对象可以设置外键名(默认为 ${源表名}Id
)。
对于关联表中的数据操作,可以使用 set${关联表名}
方法,比如对于上述例子,我们可以这样设置关联表数据:
user.setDetail(detail);
2. 一对多关联(hasMany)
一对多关联通常用于将一个表的数据与另一个表的多个数据建立联系。比如,在一个订单表中,一个订单可以对应多个商品,可以使用 hasMany
来建立这样的关系。
在 Sequelize 中,可以通过 hasMany
方法将两个表关联起来。下面是一个示例代码:
// Order 为主表,Product 为关联表 Order.hasMany(Product); // 或者 Order.hasMany(Product, { as: 'OrderProducts' });
上面代码中,我们在 Order
模型中使用 hasMany
方法,表示一个订单可以对应多个商品,该方法的第一个参数表示需要关联的表。我们还可以通过第二个参数传递一个对象,该对象可以设置关联别名(默认为 ${被关联表名}s
)。
对于关联表中的数据操作,可以使用 add${关联表名}
方法,比如对于上述例子,我们可以这样设置关联表数据:
order.addProducts(products);
3. 多对一关联(belongsTo)
多对一关联通常用于将一个表的数据与另一个表中的一个数据建立联系。比如,在一个评论表中,每一条评论都对应一个用户,可以使用 belongsTo
来建立这样的关系。
在 Sequelize 中,可以通过 belongsTo
方法将两个表关联起来。下面是一个示例代码:
// Comment 为主表,User 为关联表 Comment.belongsTo(User); // 或者 Comment.belongsTo(User, { foreignKey: 'userId' });
上面代码中,我们在 Comment
模型中使用 belongsTo
方法,表示一条评论对应一个用户,该方法的第一个参数表示需要关联的表。我们还可以通过第二个参数传递一个对象,该对象可以设置外键名(默认为 ${关联表名}Id
)。
对于关联表中的数据操作,可以使用 set${关联表名}
方法,比如对于上述例子,我们可以这样设置关联表数据:
comment.setUser(user);
4. 多对多关联(belongsToMany)
多对多关联通常用于将两个表相互关联,相互能够访问。比如,一个文章可以被多个标签绑定,一个标签也可以绑定多个文章,可以使用 belongsToMany
来建立这样的关系。
在 Sequelize 中,可以通过 belongsToMany
方法将两个表关联起来。下面是一个示例代码:
// Article 为主表,Tag 为关联表,ArticleTag 为中间表 Article.belongsToMany(Tag, { through: 'ArticleTag' }); // 或者 Article.belongsToMany(Tag, { through: ArticleTag, foreignKey: 'articleId' });
上面代码中,我们在 Article
模型中使用 belongsToMany
方法,表示一个文章可以被多个标签绑定,一个标签也可以绑定多个文章,该方法的第一个参数表示需要关联的表。我们还可以通过第二个参数传递一个对象,该对象可以设置中间表名(默认为 ${源表名}${被关联表名}
),以及外键名(默认为 ${源表名}Id
和 ${被关联表名}Id
)。
对于关联表中的数据操作,可以使用 add${关联表名}
和 get${关联表名}
方法,比如对于上述例子,我们可以这样设置关联表数据:
article.addTags(tags); article.getTags();
三、总结
本文详细介绍了 Sequelize 创建关联表的 4 种方式,包括一对一、一对多、多对一和多对多 4 种关联类型,以及如何通过 Sequelize 的方法进行建立和查询。希望这些内容可以对大家的开发工作有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647217c3968c7c53b0ff9855