विशिष्ट आईडी फ़ील्ड सम्मिलित करने के लिए Magento के ORM का उपयोग करना


14

क्या एक विशिष्ट प्राथमिक कुंजी के साथ मॉडल पंक्तियों को सम्मिलित करने के लिए Magento के साधारण ORM ( Mage_Core_Model_Abstractऔर Mage_Core_Model_Resource_Abstract) का उपयोग करने का एक तरीका है ?

उदाहरण के लिए, अगर मैं एक खाली 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तालिका में एक नई प्रविष्टि की उम्मीद है । हालांकि, Magento चुपचाप यहाँ कुछ भी नहीं करता है।

संसाधन में खोदना, ऐसा लगता है कि मैं डेटाबेस संसाधन वर्ग में इससे दूर हो रहा हूं

#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 मॉडल के साथ एक डालने के लिए मजबूर करने का एक तरीका है? (फिर से लिखे बिना / वर्ग-प्रतिस्थापन)।

हां, कच्चा एसक्यूएल एक विकल्प है, लेकिन तब घटना कार्यक्षमता खो जाती है।


आप एक ऑटोनॉइरेमेंट फ़ील्ड में आईडी असाइन करने की कोशिश क्यों कर रहे हैं? यदि यह एक डाउनस्ट्रीम निर्भरता है, तो क्या आपको सिर्फ रिकॉर्ड नहीं बनाना चाहिए और फिर ऑटोगेनेरेटेड पीके को पुनः प्राप्त करना चाहिए?
राल्फ टाइस

@RalphTice हाँ, दिन-प्रतिदिन के उपयोग के लिए यह सही बात होगी।
एलन स्टॉर्म

जवाबों:


5

तो हाँ। ( संपादित करें :) ट्रिक एक Mage_Core_Model_Abstractउपवर्ग का उपयोग करने के लिए है जिसमें आईडी फ़ील्ड नहीं है जो संसाधन मॉडल की अपेक्षा करता है:

$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
एक बार जब आप साफ हो जाते हैं - मुझे यकीन नहीं है कि मैं इसका पालन करता हूं - forsedSave gist.github.com/astorm/5219357 में एक समान आईडी चेक है । क्या यह आपके लिए काम करता है, या यह सिर्फ एक सिद्धांत था?
एलन स्टॉर्म

मेरे उत्तर को और अधिक स्पष्ट बनाने के लिए संपादित किया।
benmarks

... और इसने मेरे लिए काम किया।
benmarks

आह हा, यह वही है जो मुझे कॉपी और पेस्ट करने के बजाय अपना कोड टाइप करने के लिए मिलता है। इसे एक प्रारंभिक बिंदु के रूप में उपयोग करते हुए, क्या आप Varien_Objectअलग-अलग मॉडल वर्ग के बजाय उपयोग न करने का कोई कारण देख सकते हैं , और फिर संसाधन के गैर-मूल्यह्रास saveविधि को बुला सकते हैं ?
एलन स्टॉर्म

और ऊपर मेरे अपने प्रश्न का उत्तर देते हुए, यह इसलिए है क्योंकि सामान्य संसाधन की बचत विधि में Mage_Core_Model_Abstractडेटा ऐरे के लिए टाइप हिंटिंग है।
एलन स्टॉर्म
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.