Magento - कस्टम (गैर ईवी) मॉडल, कई क्षेत्रों द्वारा लोड


15

मेरे पास एक कस्टम मॉडल और संसाधन मॉडल है। मैं 1 से अधिक क्षेत्र का उपयोग करके मॉडल का एक भी उदाहरण लोड करना चाहता हूं।

मॉडल में निम्नलिखित क्षेत्र हैं:

id
tag_name
custom_name
group_name

मैं आईडी के बजाय tag_name, custom_name और group_name के आधार पर इस मॉडल को लोड करना चाहता हूं।

वर्तमान में मैं प्रत्येक क्षेत्र के लिए एक संग्रह और AddFilter का उपयोग कर रहा हूं। यह काम करता है, लेकिन मुझे आश्चर्य है कि अगर मैगेंटो में इस तरह की चीज के लिए एक मानक रणनीति है?

संपादित करें

कोर मैगेंटो इस परिदृश्य के लिए संग्रह का उपयोग नहीं करता है, बल्कि इसके बजाय संसाधन मॉडल में प्रत्यक्ष sql प्रश्नों का उपयोग करता है।

इसका एक उदाहरण है:

loadByAccountAndDate() में Mage_Paypal_Model_Resource_Report_Settlement

क्या इसका कोई कारण है, जब संग्रह को लिखे जाने वाले कोड की मात्रा के संदर्भ में अधिक संक्षिप्त तरीका लगता है

मैं अभी नहीं जानता कि क्यों Magento इस तरह से करने के लिए चुनता है

जवाबों:


22

मुझे लगता है कि यह एक अच्छा तरीका है। हो सकता है कि आपको मॉडल क्लास में एक रैपर बनाने की आवश्यकता हो ताकि आप बार-बार एक ही बात लिखने से बचें।
कुछ इस तरह:

public function loadByMultiple($tag, $customName, $group){
    $collection = $this->getCollection()
            ->addFieldToFilter('tag_name', $tag)
            ->addFieldToFilter('custom_name', $customName)
            ->addFieldToFilter('group_name', $group);
    return $collection->getFirstItem();
}

और आप किसी अन्य स्थान पर इस तरह से आइटम लोड कर सकते हैं:

$model = Mage::getModel('model/class_here')->loadByMultiple($tag, $customName, $group);
if ($model->getId()){
   //the instance exists
}
else{
    //not found
}

मैंने संग्रह के उपयोग पर अपनी चिंताओं के साथ अपने सवाल को अद्यतन किया है
मार्टी वालेस

यदि आप वास्तव में अपने तर्क से संग्रह को बाहर करना चाहते हैं, तो उसके उत्तर में @mageUz ने क्या लिखा है। मैंने इसका परीक्षण नहीं किया, लेकिन एक अच्छे विचार की तरह। नोट: मुझे अभी भी संग्रह का उपयोग करने में कोई समस्या नहीं दिख रही है।
मारियस

ऐसा नहीं है कि मैं उन्हें बाहर करना चाहूंगा, लेकिन मैं मैगेंटो सर्वोत्तम प्रथाओं का उपयोग करना चाहता हूं। यदि कोर कोड किसी विशेष तरीके से कुछ कर रहा है तो आम तौर पर इसका अनुसरण करने के लिए कुछ का संकेत होना चाहिए। लेकिन मैं इस मंच पर मार्गदर्शन के लिए पूछ रहा हूं क्योंकि इस मामले में मुझे वास्तव में सबसे अच्छा तरीका नहीं पता है
मार्टी वालेस

1
मुझे इस मामले में संग्रह का उपयोग करने की भी चिंता है। संभवतः प्रश्न में संग्रह में _itemObjectClassवही है जो मॉडल वास्तव में बुला रहा है loadByMultiple। इसलिए, $x = Mage::getModel('some/model')एक मॉडल का एक उदाहरण नहीं होगा और $x->loadByMultiple($tag, $customName, $group)वास्तव में एक अलग / नया उदाहरण होगा?
कोजिरो

@kojiro। हाँ, यह एक अलग उदाहरण होगा लेकिन ऐसा करता है loadByAttribute। : संदर्भ के लिए इस प्रश्न देखें magento.stackexchange.com/q/5926/146
मेरियस

7

मॉड्यूल / मॉडल / SomeModel.php

public function loadByAttributes($attributes)
{
    $this->setData($this->getResource()->loadByAttributes($attributes));
    return $this;
}

मॉड्यूल / मॉडल / संसाधन / SomeModel.php:

public function loadByAttributes($attributes)
    {
        $adapter = $this->_getReadAdapter();
        $where   = array();
        foreach ($attributes as $attributeCode=> $value) {
            $where[] = sprintf('%s=:%s', $attributeCode, $attributeCode);
        }
        $select = $adapter->select()
            ->from($this->getMainTable())
            ->where(implode(' AND ', $where));

        $binds = $attributes;

        return $adapter->fetchRow($select, $binds);
    }

और अंत में आप निम्नलिखित मॉडल लोड कर सकते हैं:

$attributes = array('tag_name'=> 'any', 'custome_name'=> 'some','group_name'=>'some');
$model      = Mage::getModel('module/somemodel')->loadByAttributes($attributes);

अपडेट किया गया

वैसे आप संग्रह के बजाय इस (loadByAttributes) विधि का आसानी से उपयोग कर सकते हैं और यह अधिक समझने योग्य है। Magento संग्रह या इकाई को लोड करते समय कुछ घटनाओं को भी भेजता है और तीसरे पक्ष का विस्तार पर्यवेक्षक द्वारा संग्रह या इकाई को अपडेट कर सकता है। यदि आप इकाई को संसाधन के माध्यम से लोड करते हैं (मेरा और आपके उदाहरण में दिया गया है) तो कोई घटना / पर्यवेक्षक आग नहीं लगाता है और आप संग्रह के बजाय "स्वच्छ" इकाई को तेजी से प्राप्त कर सकते हैं। मैगेंटो इस तरह से कैश्ड संग्रह का उपयोग नहीं करता है, इसे सीधे डीबी टेबल से लोड करता है।
हो सकता है कि मैगेंटो कोर मॉड्यूल द्वारा इस पद्धति का उपयोग करने का कारण हो।


मुझे लगता है कि आपको इस लाइन पर एक गेटडाटा () याद आ रही है: $this->setData($this->getResource()->loadByAttributes($attributes));जो होना चाहिए: $this->setData($this->getResource()->loadByAttributes($attributes)->getData()); सही?
महाई माटी

2

आप इसे सही कर रहे हैं addFilter। Magento में आप किसी भी विशेषता को लोड कर सकते हैं लेकिन एक साथ कई विशेषताओं को नहीं। फ़िल्टर जोड़कर आप बिना किसी अतिरिक्त ओवरहेड के समान प्रभाव प्राप्त करते हैं।


एक संग्रह का उपयोग करने की तुलना में एक db चयन का उपयोग करना बेहतर नहीं होगा?
मार्टी वालेस

आपको क्या लगता addFilterहै क्या कर रही है? :-)
user487772

क्या आप Mage_Paypal_Model_Resource_Report_Settlement में loadByAccountAndDate () देख सकते हैं क्योंकि यह संग्रह के बजाय कुछ चुनिंदा का उपयोग कर रहा है
मार्टी वालेस

और वास्तव में कोर कोड में यह स्थिति लगभग विशेष रूप से इस तरह की है और मैं किसी भी संग्रह का उपयोग करते हुए नहीं देख सकता
मार्टी वालेस

1
मैंने अपने सवालों को संग्रह का उपयोग करने पर अपनी चिंताओं के साथ अद्यतन किया है
मार्टी वालेस

1

सबसे पहले - एक संग्रह को फ़िल्टर करने की आपकी रणनीति सही है। क्योंकि Magento के आलसी-लोड में संग्रह आपके पास अपने संसाधन मॉडल में तरीके बनाने की क्षमता है जो आपके कस्टम लोड की आवश्यकताओं को अधिक कसकर परिभाषित करते हैं।

अपने कोड के कुछ नमूने के बिना, अपने संसाधन मॉडल में निम्नलिखित छद्म विधि पर विचार करें:

<?php


class Marty_Wallace_Model_Resource_Method extends Mage_Core_Model_Resource_Db_Abstract{

    protected function _construct()
    {
        $this->_init('yourmodel/table', 'entity_id');
    }

    public function loadByCriteria(array $filter)
    {

        //$filter should be array('columnname'=>'value','columname'=>'value')

        $collection = Mage::getModel('yourmodel/class')->getCollection();

        foreach($filter as $column=>$value){
            $collection->addFieldToFilter($column,$value);
        }

        return $collection;

    }
}

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