একটি নির্দিষ্ট আইডি ক্ষেত্র সন্নিবেশ করতে ম্যাজেন্টোর ওআরএম ব্যবহার করে


14

নির্দিষ্ট প্রাথমিক কী সহ মডেল সারিগুলি সন্নিবেশ করার জন্য কি ম্যাজেন্টোর সরল ORM ( Mage_Core_Model_Abstractএবং Mage_Core_Model_Resource_Abstract) ব্যবহার করার কোনও উপায় আছে ?

উদাহরণস্বরূপ, যদি আমি একটি খালি ম্যাজেন্টো সিস্টেমের বিরুদ্ধে নিম্নলিখিতটি চালিত করি

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পথে চলে।

ডিফল্ট ম্যাজেন্টো মডেলগুলির সাথে সন্নিবেশ করার জন্য কি কোনও উপায় আছে? (পুনর্লিখন / শ্রেণি-প্রতিস্থাপন ছাড়াই)।

হ্যাঁ, কাঁচা এসকিউএল একটি বিকল্প, তবে তারপরে ইভেন্টের কার্যকারিতা নষ্ট হয়ে যায়।


আপনি কেন একটি স্বতঃসংশোধনের ক্ষেত্রে একটি আইডি বরাদ্দ করার চেষ্টা করছেন? যদি এটি ডাউনস্ট্রিম নির্ভরতা হয় তবে আপনার কেবল রেকর্ড তৈরি করা উচিত নয় এবং তারপরে অটো-জেনারেটেড পিকে পুনরুদ্ধার করা উচিত?
রাল্ফ টাইস

@ রালফটাইস হ্যাঁ, এটি সম্ভবত প্রতিদিন ব্যবহারের জন্য সঠিক জিনিস।
অ্যালান ঝড়

উত্তর:


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 এ একই আইডি চেক রয়েছে । এটি কি আপনার পক্ষে কাজ করেছে, নাকি এটি কেবল একটি তত্ত্ব ছিল?
অ্যালান ঝড়

আমার উত্তর সম্পাদনা করে এটি আরও সুস্পষ্ট করে তুলুন।
বেনমার্কগুলি

... এবং এটা আমার জন্য কাজ করে।
বেনমার্কগুলি

আহা হ্যাঁ, আমি অনুলিপি এবং আটকানোর পরিবর্তে নিজের কোড টাইপ করার জন্য পেয়েছি। এটি একটি প্রারম্ভিক পয়েন্ট হিসাবে ব্যবহার করে, আপনি কি কোনও কারণ দেখতে পাচ্ছেন Varien_Objectযে বিভিন্ন মডেল শ্রেণীর পরিবর্তে একটি ব্যবহার না করে , এবং তারপরে সংস্থানটির অ-অবচয় saveপদ্ধতিতে কল করছেন?
অ্যালান ঝড়

এবং উপরে আমার নিজের প্রশ্নের উত্তর দেওয়া, এটি কারণ জেনেরিক রিসোর্সের সংরক্ষণ পদ্ধতিতে Mage_Core_Model_Abstractডেটা অ্যারের জন্য টাইপ ইঙ্গিত রয়েছে ।
অ্যালান ঝড়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.