如何在Sequelize中为多对多关联表ORM额外字段?
解决Sequelize v4多对多关联添加额外属性的问题
嘿,我之前在Sequelize v4搭配Postgres方言开发时,也碰到过一模一样的问题!普通的belongsToMany关联没法直接给中间表加自定义属性,得显式创建中间关联模型,再通过它来衔接Driver和Car。下面是具体的实现步骤,完全适配你用的v4.33版本:
1. 定义中间关联模型(DriverCar)
首先创建中间表的模型,把你需要的额外属性(比如color)加进去,同时包含两个主模型的外键:
const DriverCar = sequelize.define('DriverCar', { id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true }, color: { type: Sequelize.STRING, allowNull: false, comment: '该车辆的颜色' }, // 显式声明外键(也可以让Sequelize自动生成,显式写更清晰) DriverId: { type: Sequelize.INTEGER, references: { model: 'Drivers', key: 'id' } }, CarId: { type: Sequelize.INTEGER, references: { model: 'Cars', key: 'id' } } }, { tableName: 'driver_cars' // 自定义中间表名,默认是模型名复数 });
2. 配置Driver与Car的关联
接下来在Driver和Car模型里,通过belongsToMany关联,指定through为我们刚创建的DriverCar模型,同时明确外键:
Driver模型的关联配置:
Driver.belongsToMany(Car, { through: DriverCar, foreignKey: 'DriverId', // Driver在中间表的外键字段 as: 'cars' // 关联别名,查询时用这个名称获取关联数据 });
Car模型的关联配置:
Car.belongsToMany(Driver, { through: DriverCar, foreignKey: 'CarId', // Car在中间表的外键字段 as: 'drivers' // 关联别名 });
3. 创建带额外属性的关联记录
现在你可以给Driver和Car建立关联,同时设置color这类额外属性:
// 假设已经有实例化的driver和car对象 driver.addCar(car, { through: { color: '哑光黑' } });
4. 查询时获取中间表的额外属性
查询Driver或Car时,通过include关联对应模型,同时指定through来获取中间表的属性:
Driver.findOne({ where: { id: 1 }, include: [{ model: Car, as: 'cars', through: { attributes: ['color'] // 指定要获取的中间表属性 } }] }).then(driver => { // 访问关联车辆的颜色属性 console.log(driver.cars[0].DriverCar.color); });
这样就能正确追踪关联表的额外属性啦!Sequelize v4的语法和后续版本有细微差异,上面的写法完全适配你的环境。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

