ใช้ ORM ของวีโอไอพีเพื่อแทรกฟิลด์ ID ที่ระบุ


14

มีวิธีใช้ ORM ( Mage_Core_Model_AbstractและMage_Core_Model_Resource_Abstract) แบบง่ายของ Magento เพื่อแทรกแถวแบบจำลองด้วยคีย์หลักที่เฉพาะเจาะจงหรือไม่

ตัวอย่างเช่นถ้าฉันวิ่งระบบต่อไปนี้กับระบบ Magento ที่ว่างเปล่า

Mage::getModel('core/website')->setData(array (
    'website_id' => 2,
    'code' => 'foo',
    'name' => 'Main Website',
    'sort_order' => 0,
    'default_group_id' => 1,
    'is_default' => 1,
)); 

ฉันคาดว่าจะมีรายการใหม่ในcore_websiteตาราง อย่างไรก็ตามวีโอไอพีไม่ได้ทำอะไรที่นี่อย่างเงียบ ๆ

ขุดลงไปในทรัพยากรดูเหมือนว่าฉันตกหลุมนี้ในชั้นเรียนทรัพยากรฐานข้อมูล

#File: app/code/core/Mage/Core/Model/Resource/Db/Abstract.php
if (!is_null($object->getId()) && (!$this->_useIsObjectNew || !$object->isObjectNew())) {
    //update stuff here
}
else
{
    //insert stuff here
}

เนื่องจากตัวแบบมีรหัส (เช่นฉันใส่รหัสเฉพาะ) และเนื่องจาก_useIsObjectNewรหัสยากที่จะเป็นเท็จคำขอบันทึกของฉันจึงถูกส่งไปยังinsertเส้นทางเสมอ

มีวิธีบังคับให้แทรกด้วยรุ่น Magento เริ่มต้นหรือไม่? (โดยไม่ต้องเขียน / เปลี่ยนคลาส)

ใช่ SQL ดิบเป็นตัวเลือก แต่ฟังก์ชั่นเหตุการณ์จะหายไป


เหตุใดคุณจึงพยายามกำหนด ID ให้กับฟิลด์การสร้างอัตโนมัติ หากนี่คือการอ้างอิงแบบดาวน์สตรีมคุณไม่ควรสร้างเร็กคอร์ดแล้วดึงข้อมูล PK ที่สร้างอัตโนมัติ
Ralph Tice

@RalphTice ใช่ว่าอาจเป็นสิ่งที่ถูกต้องสำหรับการใช้งานแบบวันต่อวัน
Alan Storm

คำตอบ:


5

ดังนั้นใช่ ( แก้ไข :) เคล็ดลับคือใช้Mage_Core_Model_Abstractคลาสย่อยที่ไม่มีฟิลด์ id ที่โมเดลรีซอร์สต้องการ:

$evil = Mage::getModel('core/store'); // that's a store object, baby!
$evil->setData(
    array (
        'website_id' => 99,
        'code' => 'foo',
        'name' => 'Main Website9',
        'sort_order' => 0,
        'default_group_id' => 1,
        'is_default' => 1,
    )
);

Mage::getResourceModel('core/website')->forsedSave($evil);

Mage::dispatchEvent('website_save_commit_after', [...])เป็นเหตุการณ์เดียวที่ฉันเห็นว่ามีการบริโภคในแกน มันอาจจะง่ายเหมือนดังต่อไปนี้ด้วย

Mage::getModel('core/website')->setData($evil->getData())->afterCommitCallback();

ไม่ว่าในกรณีใดฉันต้องอาบน้ำ


1
เมื่อคุณทำความสะอาด - ผมไม่แน่ใจว่าฉันทำตามที่ - มีการตรวจสอบ ID ที่คล้ายกันในgist.github.com/astorm/5219357forsedSave มันใช้งานได้สำหรับคุณหรือเป็นเพียงทฤษฎีหรือไม่?
Alan Storm

แก้ไขคำตอบของฉันเพื่อทำให้ชัดเจนยิ่งขึ้น
benmarks

... และมันก็ใช้ได้ผลสำหรับฉัน
benmarks

อ้านั่นคือสิ่งที่ฉันได้รับจากการพิมพ์รหัสของตัวเองแทนที่จะคัดลอกและวาง การใช้สิ่งนี้เป็นจุดเริ่มต้นคุณจะเห็นเหตุผลที่จะไม่ใช้ Varien_Objectแทนคลาสโมเดลอื่นแล้วเรียกsaveวิธีการที่ไม่คิดค่าเสื่อมราคาของทรัพยากรหรือไม่
Alan Storm

และการตอบคำถามของฉันเองข้างต้นเป็นเพราะวิธีการบันทึกของทรัพยากรทั่วไปมีการMage_Core_Model_Abstractบอกใบ้ให้กับอาร์เรย์ข้อมูล
Alan Storm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.