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
相关产品推荐
相关产品推荐

