带你彻底了解sequelize 表关联 -- 多对多

目录

1. 理解多对多关系

2. 定义中间表模型

3.  定义关联关系

4. 查询用户角色的方法

5. 官方文档的补充说明

foreignKey 和 otherKey 具体作用

1. foreignKey

2. otherKey

为什么需要这两个字段?

总结

关联表的增删改


在使用 Sequelize 进行数据库建模时,通常需要处理多个表之间的关联关系,特别是在涉及多对多(many-to-many)关系时。为了让你更好地理解如何使用这些概念,本文将通过一个具体的示例(用户与角色的关系)来详细讲解 Sequelize 中的 belongsToMany, through, foreignKey, otherKeyreferences 等概念。

1. 理解多对多关系

在数据库设计中,多对多关系是一种常见的关联类型,表示两个模型之间可以互相拥有多个实例。例如,用户(User)和角色(Role)之间就是典型的多对多关系:一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。

为了在 Sequelize 中定义这种关系,我们需要使用 belongsToMany 方法。这个方法需要指定一个中间表(也叫连接表或 junction table),用来存储两个模型之间的关联关系。

2. 定义中间表模型

首先,我们定义了三个模型:UserRoleUserRole

  • User模型:代表用户的信息。
  • Role模型:代表角色的信息。
  • UserRole模型:作为中间表,存储用户和角色之间的关联。

每个用户可以拥有多个角色,每个角色也可以被多个用户拥有。因此,这是一个典型的多对多关系。

为了表示这种关系,我们需要一个中间表:用户角色表(UserRole),它包含了用户 ID 和角色 ID,以表示某个用户与某个角色的关联

const { DataTypes } = require("sequelize");
const seq = require("../db/seq");

const UserRole = seq.define("st_UserRole", {
  users_id: {
    type: DataTypes.INTEGER,
    allowNull: false,
    comment: "用户ID",
    references: {
      model: "st_users",  // 关联的模型表名
      key: "id",          // 关联的主键
    },
  },
  role_id: {
    type: DataTypes.INTEGER,
    allowNull: false,
    comment: "角色ID",
    references: {
      model: "st_roles",  // 关联的模型表名
      key: "id",          // 关联的主键
    },
  },
});

module.exports = UserRol

这里,UserRole 定义了两个字段:users_idrole_id,分别对应 UserRole 的主键。references 属性用来指定外键关联的模型和字段。

references:该属性定义了外键约束的具体表和字段,确保 users_idrole_id 字段分别与 users 表和 roles 表的主键字段进行关联。

3.  定义关联关系

接下来,在 setupAssociations 函数中,我们使用 belongsToMany 方法来建立 UserRole 之间的多对多关系:

const setupAssociations = () => {
  User.belongsToMany(Role, {
    through: UserRole,          // 指定中间表
    foreignKey: "users_id",    // 本模型的外键
    otherKey: "role_id",       // 目标模型的外键
  });

  Role.belongsToMany(User, {
    through: UserRole,          // 指定中间表
    foreignKey: "role_id",     // 本模型的外键
    otherKey: "users_id",      // 目标模型的外键
  });
};

module.exports = setupAssoci
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端 贾公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值