Estoy haciendo un enlace de consulta sin formato en objectjs y mi código es el siguiente:
const item = await cart.$relatedQuery('items').insert(req.body) .onConflict(['cartId', 'productId']) .merge({ amount: raw('cart_item.amount + ?', req.body.amount), price: raw('cart_item.price + ?', req.body.price) }); Los valores de req.body.amount y req.body.price pueden ser tanto positivos como negativos. Debido a esto, en algún momento, el valor final de los campos de amount y price en la base de datos también puede volverse negativo después de la suma o resta. Y quiero evitar que eso suceda. ¿Qué debo hacer en tal caso?
Intenté lo siguiente:
amount: Math.max(raw('cart_item.amount + ?', req.body.amount), 0) Pero esto no funciona (por supuesto que no debería) y devuelve NaN. No quiero poner una .unsigned() en el campo en sí, sino verificar durante el tiempo de ejecución. ¿Hay alguna manera de obtener lo que quiero sin hacer múltiples consultas para obtener los valores de amount y price de antemano y verificar antes de insertar los nuevos valores?
¿Puedes hacer esto?
amount: raw('cart_item.amount + ?', ((cart_item.amount + req.body.amount) >= 0) ? req.body.amount : 0 ),la forma en que lo haría en tiempo de ejecución es usando transacciones :
const trx = await Item.startTransaction() try { const item = await cart .$relatedQuery('items', trx) // make sure to pass the transaction .insert(req.body) .onConflict(['cartId', 'productId']) .merge({ amount: raw('cart_item.amount + ?', req.body.amount), price: raw('cart_item.price + ?', req.body.price) }); if (item.price < 0 || item.amount < 0 ) { // this will trigger the catch block and revert the operation throw new Error(...) } // success return as response or something res.json(item) await trx.commit() } catch (err) { await trx.rollback() return next(err) }