如何在Sequelize多对多关联中增减orderproduct表的quantity值
在Sequelize多对多关联中增减关联表的quantity字段
你的现有代码存在两处问题:一是拼写错误(exits应为exists),二是addProduct默认不会更新已存在的关联记录,只会创建新关联或忽略已存在项。要实现增减关联表quantity字段的需求,有两种可行方案:
方案一:先查询现有值再更新
通过getProducts获取当前关联的quantity,计算新值后用addProduct结合upsert: true触发更新:
const product = await Product.findByPk('152b12ac-a59e-44f1-b83f-9770e0b8c01e'); const exists = await order.hasProduct(product); if (exists) { // 获取关联表中当前的quantity值 const [currentProduct] = await order.getProducts({ where: { id: product.id }, through: { attributes: ['quantity'] } }); // 这里以递增1为例,递减则改为减1 const newQuantity = currentProduct.dataValues.quantity + 1; // 用upsert: true触发更新操作 await order.addProduct(product, { through: { quantity: newQuantity }, upsert: true }); }
方案二:直接用关联模型的增量操作(推荐)
如果已经定义了关联表模型(比如OrderProduct),可以直接调用increment/decrement方法,在数据库层面完成原子操作,无需先查询,效率更高且避免并发冲突:
const productId = '152b12ac-a59e-44f1-b83f-9770e0b8c01e'; const orderId = order.id; // 递增quantity(加1) await OrderProduct.increment('quantity', { where: { orderId, productId }, by: 1 // 可自定义增量值,默认是1 }); // 递减quantity(减1,同时防止负数) // await OrderProduct.decrement('quantity', { // where: { // orderId, // productId, // quantity: { [Op.gte]: 1 } // 确保quantity至少为1才允许递减 // }, // by: 1 // });
注意事项
- 若使用方案一,必须添加
upsert: true,否则addProduct会忽略已存在的关联,不会更新quantity。 - 方案二中需要确保
OrderProduct模型已正确定义,包含orderId、productId和quantity字段,且已在Order和Product的关联中指定through: OrderProduct。 - 递减操作建议添加
quantity >= 1的条件,避免出现负数数量。
内容的提问来源于stack exchange,提问作者Mehmet Baki
相关产品推荐
相关产品推荐

