Magento 2 - ธุรกรรมฐานข้อมูลสำหรับวัตถุโมเดล / ทรัพยากรหลายรุ่น?


11

หากฉันมีลอจิกที่เกี่ยวข้องกับการอัปเดตวัตถุหลายรุ่นซึ่งจะอัปเดตบางตารางในฐานข้อมูลวิธีการทำธุรกรรมฐานข้อมูลเพื่อให้แน่ใจว่ามีความสมบูรณ์ของข้อมูล

คำตอบ:


22

คุณอาจบันทึกรวมวัตถุที่เชื่อมต่อหลายรายการ ตรวจสอบสิ่งที่วัตถุเหล่านี้เป็นรากเช่น:

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

เพิ่มตรรกะการอัปเดตในโมเดลทรัพยากรของรูทและใช้ธุรกรรมที่นั่น

วิธีใช้ธุรกรรม

  1. หากคุณต้องการบันทึกอินสแตนซ์ของโมเดลหลายอินสแตนซ์คุณสามารถใช้โมเดลธุรกรรม ฉีดโรงงานทำธุรกรรม\Magento\Framework\DB\TransactionFactoryในรูปแบบทรัพยากรของคุณและใช้งานเช่นนี้:

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

    Commit หรือ rollback ได้รับการจัดการโดยอัตโนมัติโดยsave()วิธีการ

  2. หรือคุณสามารถใช้ธุรกรรมโดยตรง (ถ้าคุณใช้การอัพเดทฐานข้อมูลอื่นที่ไม่ใช่$model->save():

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

มีวิธีใดที่ได้รับการสนับสนุนในการบันทึกออบเจกต์ mutiple ขณะใช้ที่เก็บ? พวกเขาเรียกsave()วิธีการของแบบจำลองทรัพยากรภายในดังนั้นแต่ละวิธีจะถูกบันทึกไว้ในธุรกรรมที่แยกต่างหาก ที่เก็บมักจะมีตรรกะการตรวจสอบบางอย่างดังนั้นจึงแนะนำให้ใช้พวกเขาแทนsave()วิธีการแบบทรัพยากรธรรมดา
Bartosz Kubicki

1
@BartoszKubicki มี หากแบบจำลองทรัพยากรสองแบบใช้การเชื่อมต่อเดียวกัน (ซึ่งมักทำแบบนี้แบบเริ่มต้น) การบันทึกความสัมพันธ์ใน afterSave () ของทรัพยากรแรกจะทำให้แบบสอบถามเพิ่มไปยังธุรกรรมเดียวกัน ดูวิธีการบันทึกคำสั่งซื้อทีละบรรทัด OrderRepository :: save () เป็นจุดเริ่มต้น
vitoriodachef
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.