क्या पैजेशन के साथ मैगेंटो के संग्रह पर मूल रूप से पुनरावृति संभव है?


21

मेरे कहने का मतलब है - क्या ऐसा करने का कोई तरीका है:

$collection = $model->getCollection();
foreach ($collection as $item) { 
    $item->doStuff();
}

इस तरह से कि भले ही संग्रह में 100k पंक्तियां थीं, यह केवल MySQL से एक समय में पंक्तियों के एक पृष्ठ को लोड करेगा और पर्दे के पीछे से आपके लिए जादुई रूप से उन्हें पृष्ठांकित करेगा।

देखने से Varien_Data_Collection_Db::load()ऐसा नहीं लगता कि यह संभव है, लेकिन सिर्फ जाँच करना चाहता था। यह कुछ ऐसा लगता है जो एक सामान्य आवश्यकता होनी चाहिए।

जवाबों:


18

आपको वास्तव में उपयोग करना चाहिए

Mage::getSingleton('core/resource_iterator')

इस प्रयोजन के लिए, क्योंकि यह आपके द्वारा उल्लिखित प्रदर्शन कारणों के लिए विशुद्ध रूप से मौजूद है।

अन्यथा, आप लूप का उपयोग करके थोड़ा कम सुरुचिपूर्ण समाधान का उपयोग कर सकते हैं setPageSize- यहां एक अच्छा उदाहरण है, /programming/3786826/how-to-loop-a-magento-collection


1
आप, श्रीमान, सज्जन और विद्वान हैं।
कालेंजर्डन

+1 setPageSizeक्योंकि यह शब्दार्थ है।
16'13

एक और बात जो मुझे महसूस हुई कि core/resource_iteratorसमाधान वास्तव में mysql क्वेरी को शांत नहीं करता है। यह एक बार में सेट किए गए पूरे परिणाम को लोड करता है, लेकिन फिर यह आपको अपने पीएचपी कोड से निपटने के लिए एक बार में एक पंक्ति देता है। तो यह PHP के भीतर मेमोरी दोष से बचता है, लेकिन कुछ बिंदु पर यह mysql अधिकतम पैकेट आकार को ट्रिगर करेगा, यदि परिणाम सेट बहुत बड़ा है। मुझे लगता है कि मैं एक अच्छा सार chunked resource_iterator बनाने की कोशिश करने जा रहा हूँsetPageSize()
kalenjordan

हाँ, मुझे लगता है कि mwoar अंक का पीछा में छोड़ दिया ! यह वास्तव में एक उत्पाद संग्रह बनाम एक संग्रहित संग्रह के उद्देश्य से है। लेकिन इसे आधार के रूप में काम करना चाहिए।
बेन लेसानी - सोनासी

मैंने एक सामान्य बैच वाले इट्रेटर को कार्यान्वित किया जो MySQL के प्रश्नों को बैचता है, लेकिन एक व्यक्तिगत संग्रह आइटम कॉलबैक भी प्रदान करता है। जिज्ञासु आप क्या सोचते हैं: gist.github.com/kalenjordan/5483065
kalenjordan

5

मैं बेन लेसानी से सहमत हूं कि यदि संभव हो तोcore/iterator बड़े संग्रह को एक पंक्ति में लोड करने के लिए आपको संसाधन मॉडल का उपयोग करना चाहिए ।

हालाँकि, सीमाएँ हैं। जैसा कि " addAttributeToSelect में कोर / रिसोर्स_टाइटर के साथ काम नहीं करने के बारे में बताया गया है" यह ईएवी मॉडल के साथ अच्छी तरह से काम नहीं करता है यदि आपको विशेषता मान तालिकाओं से मान शामिल करने की आवश्यकता है।

और StackOverflow से जुड़ा उदाहरण वास्तव में उतना अच्छा नहीं है क्योंकि यह विभिन्न LIMITभावों के साथ एक ही क्वेरी को दोहराता है । जटिल प्रश्नों के लिए यह एक प्रदर्शन समस्या हो सकती है, लेकिन इससे भी अधिक महत्वपूर्ण है, अगर नई पंक्तियों को बीच में जोड़ दिया जाए तो आपको डुप्लिकेट मिल जाएगा।

चंक्स में संग्रह को संभालने का एक बेहतर तरीका यह है कि सभी आईडी को पहले लोड किया जाए, फिर इन आईडी का उपयोग वास्तविक पृष्ठांकित संग्रह के लिए फ़िल्टर के रूप में करें।

उत्पादों के लिए सरल उदाहरण:

$ids = Mage::getModel('catalog/product')
    ->getCollection()
    ->getAllIds();

$page = 1;
do {
    $collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->addIdFilter($ids)
        ->setPageSize(100)
        ->setCurPage($page);

    $results = $collection->load();

    // do stuff ......

    $page++;

} while ($results->count());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.