You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sequelize 3如何通过单pivot表实现User、Area、Level三表多对多关联

解答

Sequelize 3可以实现该需求,你之前配置的两两hasMany以及默认的belongsToMany多对多规则仅支持双外键中间表,三外键关联场景需要将area_employee_levels定义为独立的模型后再配置关联。

关联配置步骤

  • 第一步:定义中间表模型AreaEmployeeLevel,将三个外键设为联合主键避免重复数据
const AreaEmployeeLevel = sequelize.define('AreaEmployeeLevel', {
  user_id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    references: { model: 'users', key: 'id' }
  },
  area_id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    references: { model: 'areas', key: 'id' }
  },
  level_id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    references: { model: 'levels', key: 'id' }
  }
}, {
  tableName: 'area_employee_levels',
  timestamps: false // 不需要自动维护createdAt、updatedAt字段可开启
});
  • 第二步:配置三个主模型和中间表的关联关系
// User与中间表关联
User.hasMany(AreaEmployeeLevel, { foreignKey: 'user_id' });
AreaEmployeeLevel.belongsTo(User, { foreignKey: 'user_id' });

// Area与中间表关联
Area.hasMany(AreaEmployeeLevel, { foreignKey: 'area_id' });
AreaEmployeeLevel.belongsTo(Area, { foreignKey: 'area_id' });

// Level与中间表关联
Level.hasMany(AreaEmployeeLevel, { foreignKey: 'level_id' });
AreaEmployeeLevel.belongsTo(Level, { foreignKey: 'level_id' });

全关联用户查询方法

查询时嵌套include关联中间表及另外两个模型即可拿到完整关联数据:

User.findAll({
  include: [{
    model: AreaEmployeeLevel,
    include: [Area, Level]
  }]
}).then(userList => {
  // 单条用户数据的关联内容可通过以下路径获取:
  // 单条关联的区域:userList[n].AreaEmployeeLevels[m].Area
  // 单条关联的等级:userList[n].AreaEmployeeLevels[m].Level
  console.log(userList);
});

如果需要扁平化的查询结果,可以在查询参数中添加raw: true,注意处理不同模型同名字段的别名冲突即可。

内容的提问来源于stack exchange,提问作者memeister

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:54:08