Express+Bookshelf.js多对多关联时如何向中间表插入quantity字段
在Bookshelf.js多对多关联中插入中间表的额外字段值
这个问题我之前也碰到过,要在product_factors中间表的quantity字段插入值,需要调整模型的关联定义和attach方法的传参方式,具体步骤如下:
1. 更新模型关联定义,声明包含中间表的额外字段
首先要在belongsToMany关联中通过.withPivot()方法指定中间表的quantity字段,这样Bookshelf才会识别并允许操作这个字段。修改后的模型代码如下:
const Product = Bookshelf.Model.extend({ tableName: 'products', factors() { // 关联Factor模型,指定中间表和外键,同时添加withPivot包含quantity return this.belongsToMany('Factor', 'product_factors', 'product_id', 'factor_id') .withPivot(['quantity']); } }) const Factor = Bookshelf.Model.extend({ tableName: 'factors', products() { // 双向关联同样添加withPivot,确保从Factor端也能访问quantity字段 return this.belongsToMany('Product', 'product_factors', 'factor_id', 'product_id') .withPivot(['quantity']); } })
2. 修改关联时的attach传参,携带额外字段值
原来的attach([3,5])只是传入了关联的Factor ID,现在需要改成包含外键和额外字段的对象数组。假设你的请求体里会传入每个Factor对应的quantity(比如req.body.factors是[{factorId: 3, quantity: 10}, {factorId: 5, quantity: 20}]这样的结构),修改后的接口代码如下:
/** Create product */ router.route('/').post((req, res) => { new Product({name: req.body.name}) .save() .then(product => { // 将前端传来的因子数据转换为Bookshelf需要的格式 const factorRelations = req.body.factors.map(item => ({ factor_id: item.factorId, // 对应中间表的factor_id字段 quantity: item.quantity // 要插入的quantity值 })); // 传入对象数组执行关联,同时插入quantity return product.factors().attach(factorRelations); }) .then(() => { res.status(201).json({ message: 'Product created with factors and quantities' }) }) .catch(err => { res.status(500).json({ error: err.message }); }); })
补充说明
attach方法支持多种传参形式:单个ID、ID数组,或者包含外键和额外字段的对象数组,这里我们用第三种方式来传递中间表的额外数据。- 如果后续需要更新已关联的
quantity值,可以使用updatePivot方法,比如:product.factors().where('factor_id', 3).updatePivot({quantity: 15})。
内容的提问来源于stack exchange,提问作者sandum
相关产品推荐
相关产品推荐

