Magento 2 - Birden çok model / kaynak modeli nesnesi için veritabanı işlemi?


11

Veritabanındaki birkaç tabloyu güncelleyecek birden fazla model nesnesinin güncellenmesini içeren bir mantığım varsa, veri bütünlüğünü sağlamak için bir veritabanı işlemi nasıl sağlanır?

Yanıtlar:


22

Muhtemelen birden fazla bağlı nesnenin toplamını kaydediyorsunuzdur. Bu nesnelerden hangisinin kök olduğunu belirleyin , örneğin:

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

Güncelleme mantığını kökün kaynak modeline ekleyin ve orada bir işlem kullanın.

İşlemler nasıl kullanılır?

  1. Birden çok model örneğini kaydetmek istiyorsanız, işlem modelini kullanabilirsiniz. \Magento\Framework\DB\TransactionFactoryKaynak modelinize bir işlem fabrikası enjekte edin ve şu şekilde kullanın:

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

    Taahhüt veya geri alma save()yöntem tarafından otomatik olarak işlenir .

  2. Alternatif olarak, işlemleri doğrudan kullanabilirsiniz (aşağıdakilerden başka bir veritabanı güncellemesi kullanıyorsanız $model->save():

    $connection = $this->getConnection();
    $connection->beginTransaction();
    try {
        ...
        $connection->commit();
    } catch (\Exception $e) {
        $connection->rollBack();
        throw $e;
    }

Depoları kullanırken çoklu nesneleri kaydetmenin desteklenen bir yolu var mı? save()Kaynak modellerinin yöntemlerini dahili olarak çağırırlar , bu nedenle her biri ayrı işlemlere kaydedilir. Depolar genellikle bazı doğrulama mantığı içerir, bu nedenle genellikle düz kaynak modeli save()yöntemleri yerine kullanılması önerilir .
Bartosz Kubicki

1
@BartoszKubicki var. İki kaynak modeli aynı bağlantıyı kullanırsa (genellikle yaptıkları varsayılan bağlantı), ilişkinin ilk kaynağın afterSave () öğesine kaydedilmesi, sorguların aynı işleme eklenmesine neden olur. Siparişlerin nasıl kaydedildiğine, satır satır bakın. OrderRepository :: save () giriş noktasıdır.
vitoriodachef
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.