Magento 2 - Datenbanktransaktion für mehrere Modell- / Ressourcenmodellobjekte?

11

Wenn ich eine Logik habe, die das Aktualisieren mehrerer Modellobjekte umfasst, wodurch einige Tabellen in der Datenbank aktualisiert werden, wie kann eine Datenbanktransaktion bereitgestellt werden, um die Datenintegrität sicherzustellen?

Paul
quelle

Antworten:

22

Sie speichern wahrscheinlich ein Aggregat mehrerer verbundener Objekte. Bestimmen Sie, welches dieser Objekte die Wurzel ist , zum Beispiel:

               [order]              <------ this is the root
               /  |  \
billing_address   |   shipping_address
                  |
            order_items

Fügen Sie die Aktualisierungslogik in das Ressourcenmodell des Stamms ein und verwenden Sie dort eine Transaktion.

Verwendung von Transaktionen

  1. Wenn Sie mehrere Modellinstanzen speichern möchten, können Sie das Transaktionsmodell verwenden. Fügen Sie eine Transaktionsfactory \Magento\Framework\DB\TransactionFactoryin Ihr Ressourcenmodell ein und verwenden Sie sie wie folgt:

    $saveTransaction = $this->transactionFactory->create();
    $saveTransaction->addObject($objectToSave);
    $saveTransaction->addObject($otherObjectToSave);
    ...
    $saveTransaction->save();

    Commit oder Rollback werden von der save()Methode automatisch verarbeitet .

  2. Alternativ können Sie Transaktionen direkt verwenden (wenn Sie andere Datenbankaktualisierungen verwenden als $model->save():

    $connection = $this->getConnection();
    $connection->beginTransaction();
    try {
        ...
        $connection->commit();
    } catch (\Exception $e) {
        $connection->rollBack();
        throw $e;
    }
Fabian Schmengler
quelle
Gibt es eine unterstützte Möglichkeit, mehrere Objekte während der Verwendung von Repositorys zu speichern? Sie rufen intern save()Methoden von Ressourcenmodellen auf, sodass jede von ihnen in separaten Transaktionen gespeichert wird. Repositorys enthalten häufig eine Validierungslogik. Daher wird im Allgemeinen empfohlen, sie anstelle einfacher save()Methoden für Ressourcenmodelle zu verwenden.
Bartosz Kubicki
1
@ BartoszKubicki gibt es. Wenn zwei Ressourcenmodelle dieselbe Verbindung verwenden (was normalerweise der Fall ist, die Standardverbindung), werden beim Speichern der Beziehung in afterSave () der ersten Ressource Abfragen zu derselben Transaktion hinzugefügt. Sehen Sie sich an, wie Bestellungen Zeile für Zeile gespeichert werden. OrderRepository :: save () ist der Einstiegspunkt.
Vitoriodachef