Menggunakan ORM Magento untuk Memasukkan Bidang ID Khusus

14

Apakah ada cara untuk menggunakan ORM sederhana Magento ( Mage_Core_Model_Abstractdan Mage_Core_Model_Resource_Abstract) untuk memasukkan baris model dengan kunci primer spesifik?

Misalnya, jika saya menjalankan yang berikut ini terhadap sistem Magento kosong

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

Saya harapkan entri baru di core_websitetabel. Namun, Magento diam-diam tidak melakukan apa pun di sini.

Menggali sumber daya, sepertinya saya tidak setuju dengan ini di kelas sumber daya database

#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
}

Karena model memiliki id (yaitu saya memasukkan ID tertentu), dan karena _useIsObjectNewsulit dikodekan ke false, permintaan simpan saya selalu dialihkan ke insertjalur.

Apakah ada cara untuk memaksa sisipan dengan model Magento default? (tanpa penulisan ulang / penggantian kelas).

Ya, SQL mentah adalah sebuah opsi, tetapi kemudian fungsionalitas acara hilang.

Alan Storm
sumber
Mengapa Anda mencoba menetapkan ID ke bidang peningkatan otomatis? Jika ini adalah ketergantungan hilir, bukankah seharusnya Anda hanya membuat catatan dan kemudian mengambil PK autogenerasi?
Ralph Tice
@RalphTice Ya, itu mungkin akan menjadi hal yang tepat untuk digunakan sehari-hari.
Alan Storm

Jawaban:

5

Jadi ya. ( edit :) Caranya adalah dengan menggunakan Mage_Core_Model_Abstractsubkelas yang tidak memiliki bidang id yang diharapkan oleh model sumber daya:

$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', [...])hanya acara yang saya lihat sedang dikonsumsi dalam inti. Ini bisa sesederhana mengikuti

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

Bagaimanapun, saya perlu mandi.

tanda batas
sumber
1
Setelah Anda bersih - saya tidak yakin saya mengikutinya - ada pemeriksaan id serupa di forsedSave gist.github.com/astorm/5219357 . Apakah ini berhasil untuk Anda, atau hanya sebuah teori?
Alan Storm
Sunting jawaban saya untuk membuatnya lebih jelas.
patokan
... dan itu berhasil bagi saya.
patokan
Ah ha, itu yang saya dapatkan untuk mengetik kode saya sendiri daripada menyalin dan menempel. Menggunakan ini sebagai titik awal, dapatkah Anda melihat alasan untuk tidak menggunakan Varien_Objectkelas model yang berbeda, dan kemudian memanggil metode sumber daya yang tidak disusutkan save?
Alan Storm
Dan menjawab pertanyaan saya sendiri di atas, itu karena metode penyimpanan sumber daya generik memiliki Mage_Core_Model_Abstracttipe mengisyaratkan untuk array data.
Alan Storm