Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

145
Vistas
Cómo hacer algunas comprobaciones de restricciones durante la consulta sin procesar de knex/objectionjs

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?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

¿Puedes hacer esto?

 amount: raw('cart_item.amount + ?', ((cart_item.amount + req.body.amount) >= 0) ? req.body.amount : 0 ),
about 4 years ago · Juan Pablo Isaza Denunciar

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) }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda