Risposte:
Probabilmente stai salvando un aggregato di più oggetti connessi. Determina quale di questi oggetti è la radice , ad esempio:
[order] <------ this is the root
/ | \
billing_address | shipping_address
|
order_items
Aggiungi la logica di aggiornamento nel modello di risorsa della radice e usa una transazione lì.
Se si desidera salvare più istanze del modello, è possibile utilizzare il modello di transazione. Iniettare una factory di transazione \Magento\Framework\DB\TransactionFactory
nel modello di risorsa e utilizzarla in questo modo:
$saveTransaction = $this->transactionFactory->create();
$saveTransaction->addObject($objectToSave);
$saveTransaction->addObject($otherObjectToSave);
...
$saveTransaction->save();
Il commit o il rollback viene gestito automaticamente dal save()
metodo.
In alternativa è possibile utilizzare le transazioni direttamente (se si utilizzano aggiornamenti di database diversi da $model->save()
:
$connection = $this->getConnection();
$connection->beginTransaction();
try {
...
$connection->commit();
} catch (\Exception $e) {
$connection->rollBack();
throw $e;
}
save()
metodi di modelli di risorse, quindi ciascuno di essi verrà salvato in transazioni separate. I repository contengono spesso alcune logiche di convalida, quindi in genere si consiglia di utilizzarli anziché semplicisave()
metodi del modello di risorsa .