如何为Sequelize的belongsToMany关联生成的中间表添加额外列
Sequelize多对多中间表新增额外字段实现方式
你不能直接在belongsToMany的关联参数中定义中间表的额外字段,需要先显式定义中间表的独立模型,再在关联配置中引用该模型即可。
步骤1:定义中间表order_list的独立模型
const { DataTypes } = require('sequelize'); // 传入你的sequelize实例定义中间表模型 const OrderList = sequelize.define('order_list', { customers_cid: { type: DataTypes.INTEGER, allowNull: false, references: { model: 'customers', // 对应customer表的实际表名 key: 'cid' } }, store_products_spid: { type: DataTypes.INTEGER, allowNull: false, references: { model: 'store_products', // 对应storeProduct表的实际表名 key: 'spid' } }, // 新增的quantity字段 quantity: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 1 // 可按需设置默认值 } }, { timestamps: false // 按需配置是否需要createdAt、updatedAt字段 });
步骤2:修改原有多对多关联配置
把关联参数中through的字符串值,替换为上面定义好的中间表模型即可:
customer.belongsToMany(storeProduct, { through: OrderList, // 替换为中间表模型,不要传字符串 unique: false, foreignKey: 'customers_cid', otherKey: 'store_products_spid' }); storeProduct.belongsToMany(customer, { through: OrderList, // 替换为中间表模型,不要传字符串 unique: false, foreignKey: 'store_products_spid', otherKey: 'customers_cid' }); // 开发环境执行同步即可自动新增quantity字段 // 生产环境建议使用Sequelize迁移功能修改表结构,避免用alter导致数据丢失 sequelize.sync({ alter: true });
额外字段使用示例
- 新增关联时携带quantity参数:
// 给指定用户绑定指定商品,同时设置购买数量为3 await customer.addStoreProduct(yourStoreProductInstance, { through: { quantity: 3 } });
- 查询时自动带出中间表字段:
const customerWithProducts = await customer.findByPk(用户ID, { include: storeProduct }); // quantity字段会存在返回结果的storeProduct.order_list.quantity属性中
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

