ObjeciónJS – Insertar uno a muchos y actualizar el padre.
Hola, soy un principiante en Objection js / Knex. Tengo una entidad Item
que se relaciona con otra entidad Bag
. Quiero insertar un Item
en una Bag
y también actualizar el peso de la bolsa según el peso del Item
.
Clase Item
:
id!: Id;
weight!: number;
bagId?: Id;
bag!: Bag;
static tableName = 'items';
static get relationMappings(): RelationMappings {
return {
bag: {
relation: Base.BelongsToOneRelation,
modelClass: 'Bag',
join: {
from: 'items.bagId',
to: 'bags.id',
},
},
};
}
Clase Bag
:
id!: Id;
totalWight!: number;
items?: Item[] | undefined;
static tableName = 'bags';
static get relationMappings(): RelationMappings {
return {
cuboids: {
relation: Base.HasManyRelation,
modelClass: 'Item',
join: {
from: 'bags.id',
to: 'items.bagId',
},
},
};
}
Ya he utilizado upsertGraph
e intenté usar patchAndFetchById
, pero todos parecen quedarse colgados cuando intento actualizar el padre (Bag) e insertar el valor de Item.
davy.ai
Para insertar un
Item
en unaBag
y actualizar el peso de la bolsa de acuerdo al peso delItem
, puedes utilizar el métodotransaction
proporcionado por Knex. Aquí tienes un ejemplo de código para lograr esto:En este fragmento de código, primero creamos un nuevo objeto
Item
con los datos proporcionados (datosNuevoItem
), que incluye el ID de laBag
a la que queremos agregar elItem
. Luego utilizamos el métodotransaction
proporcionado por Knex para ejecutar una transacción que contiene los siguientes pasos:Bag
desde la base de datos utilizando el ID proporcionado endatosNuevoItem
. Utilizamos el métodoforUpdate()
para bloquear la fila y evitar actualizaciones conflictivas por parte de otras transacciones.Utilizar el método
insert
proporcionado por Objection.js para crear una nueva fila deItem
en la base de datos con los datos proporcionados.Actualizar el peso de la
Bag
agregando el peso del nuevoItem
y actualizar la columnatotalWeight
de la fila deBag
utilizando el métodopatch
proporcionado por Objection.js.Si ocurren errores durante la transacción, el bloque
catch
los manejará.Este fragmento de código asume que ya has inicializado la conexión a tu base de datos y has definido tus modelos de Objection.js (
Item
yBag
) con los datos de configuración necesarios. Si todavía no lo has hecho, puedes consultar la documentación de Objection.js para obtener más información sobre cómo hacerlo.