Respuestas:
Probablemente esté guardando un agregado de múltiples objetos conectados. Determine cuál de estos objetos es la raíz , por ejemplo:
[order] <------ this is the root
/ | \
billing_address | shipping_address
|
order_items
Agregue la lógica de actualización en el modelo de recurso de la raíz y use una transacción allí.
Si desea guardar varias instancias de modelo, puede usar el modelo de transacción. Inyecte una fábrica de transacciones \Magento\Framework\DB\TransactionFactory
en su modelo de recurso y úsela así:
$saveTransaction = $this->transactionFactory->create();
$saveTransaction->addObject($objectToSave);
$saveTransaction->addObject($otherObjectToSave);
...
$saveTransaction->save();
Confirmar o deshacer se maneja automáticamente por el save()
método.
Alternativamente, puede usar transacciones directamente (si usa otras actualizaciones de la base de datos que no sean $model->save()
:
$connection = $this->getConnection();
$connection->beginTransaction();
try {
...
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
save()
métodos de modelos de recursos, por lo que cada uno de ellos se guardará en transacciones separadas. Los repositorios a menudo contienen cierta lógica de validación, por lo que generalmente se recomienda usarlos en lugar desave()
métodos de modelo de recursos simples .