Magento में संग्रह को कैसे क्लोन किया जाए?


12

मेरे पास एक संग्रह में एक विधि है जहां मैं इस संग्रह पर दो अलग-अलग ऑपरेशन करना चाहता हूं। इसलिए, मैं एक ही संग्रह की दो अलग-अलग प्रतियां चाहता हूं, और फिर दो संग्रह में से एक को फिर से मूल संग्रह को सौंप दूंगा और इसे वापस कर दूंगा।

इसे सरल बनाने के लिए, मान लीजिए कि मेरे पास एक ऑब्जेक्ट संग्रह है जिसे कहा जाता है $collection

अब, मैं इसे PHP क्लोनिंग के साथ आज़मा रहा हूँ क्योंकि मुझे नहीं पता कि कोई Magento संग्रह क्लोनिंग इनबिल्ट है या नहीं।

$coll1 = clone $collection;
$coll2 = clone $collection;

अब मैं मूल संग्रह के इन दो अलग-अलग क्लोनों पर अलग-अलग ऑपरेशन करने की कोशिश कर रहा हूं, कुछ ऐसा।

$coll1->getSelect()->where('some where condition');
$coll2->getSelect()->where('some different where condition');
if($coll1->count() == 0) {
    $collection = $coll2;
} else {
    $collection = $coll1;
}

लेकिन अजीब बात यह है कि, इन दोनों क्लोन संग्रहों में उन दोनों स्थितियों को निर्दिष्ट किया गया है जहाँ पर असाइन किया गया है! $ coll2 की स्थिति के साथ $ coll2 की स्थिति में $ Coll2 शर्त लागू की जाती है, और इसके विपरीत।

क्या किसी को पता है कि यह कैसे प्राप्त करने के लिए?

धन्यवाद!

जवाबों:


14

PHP क्लोन ऑपरेटर का उपयोग, जहाँ गहरी क्लोनिंग वांछित है, कक्षाओं की आवश्यकता होती है, जो गुणों पर वस्तुओं को संग्रहीत करते हैं, वस्तुओं की प्रतिलिपि बनाने के लिए __clone विधि को लागू करते हैं। यदि वे इसे परिभाषित नहीं करते हैं, तो दोनों उदाहरणों के गुण एक ही वस्तु को संदर्भित करेंगे।

Magento के संग्रह सार पर __clone लागू नहीं होता है, और इसलिए आप इसे चाहते हुए गहरी क्लोनिंग का समर्थन नहीं करते हैं।

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

आपके द्वारा दिए गए उदाहरण (उदाहरण के लिए) का चयन क्लोन को बदलने के लिए किया जा सकता है, इसे संशोधित करने के लिए रिकॉर्ड की एक गिनती का चयन करें जिसे उसने लोड किया होगा और फिर उस परिणाम के आधार पर संग्रह को संशोधित किया जाएगा। यह भी बेहतर प्रदर्शन करेगा क्योंकि आप एक संग्रह लोड नहीं कर रहे हैं और इसे केवल एक का उपयोग करने के लिए निर्धारित करने के लिए गिन रहे हैं।

संपादित करें: निम्नलिखित दर्शाया गया है कि कैसे लोड किए बिना या वास्तव में संग्रह को संशोधित किए बिना एक गिनती को पकड़ो।

$collection = Mage::getModel(...)->getCollection();

$count = $collection->getSelectCountSql();
$count->where('some where condition');
if ($count->query()->fetchColumn() == 0) {
    ...
} else {
    ...
}

बस एक छोटा सा विवरण: $collection->getSelect()संग्रह में कहां और कहां सहेजा गया है, इसकी जानकारी नहीं है।
फेबियन ब्लेसश्मिड

उत्तर के लिए धन्यवाद। लेकिन जहां आवेदन करने के बाद केवल मैं संग्रह संख्या जानना चाहता हूं, और उस गणना के आधार पर मैं केवल यह तय करना चाहता हूं कि अलग-अलग स्थिति का उपयोग करना है या नहीं। क्या आप बेहतर तरीके से समझने के लिए कुछ कोड स्निपेट पोस्ट कर सकते हैं?
MagExt

कोड उदाहरण के साथ अद्यतित उत्तर। जैसा कि @FabianBlechschmidt ने बताया, चयन में कहाँ है, जो कि आपकी विशिष्ट परेशानी है, क्योंकि यह संग्रह वस्तु के क्लोन होने पर क्लोन नहीं किया जाता है और दोनों एक ही चयन ऑब्जेक्ट उदाहरण का संदर्भ देते हुए समाप्त होते हैं।
davidalger

अपडेट के लिए धन्यवाद। मैंने यह कोशिश नहीं की है क्योंकि मुझे पहले से ही इस तरह का समाधान मिल गया है।
MagExt

वास्तव में अगर संग्रह को क्लोन करने वाला कोई मुद्दा है, तो इस प्रक्रिया में धारावाहिक और गैर-व्याख्यात्मक मददगार हो सकते हैं। PHP में क्लोन करने के लिए अन्य विकल्प भी हैं जो बहुत अच्छे हैं। लेकिन सभी डेविड में सब सही है ... मूल रूप से जब आप उस ऑब्जेक्ट को क्लोन कर रहे होते हैं, तो आप उस बिंदु से जुड़े नीडिंत ऑब्जेक्ट के लिए पॉइंटर्स को क्लोन कर रहे होते हैं, हालांकि उसका उत्तर अंतर्निहित मुद्दे को ठीक से नहीं बताता है।
mprototype

1

@ Davidalger के उत्तर पर विस्तार करने के लिए, यदि आप किसी गणना से भिन्न ऑपरेशन करना चाहते हैं, तो आप सेलेक्ट को रीसेट कर सकते हैं - जैसे:

$select= $collection->getSelectCountSql()->reset();

$select
    ->from('newsletter_subscriber', array('some_column'))
    ->distinct();

हालांकि सावधान रहें, यह बाद में इस प्रक्रिया में हानिकारक प्रभाव हो सकता है क्योंकि यह संग्रह को संशोधित करता है।

बेहतर तरीका यह होगा कि किसी भी तरह से सिलेक्शन को क्लोन किया जाए, लेकिन उथली कॉपी में कटौती नहीं होगी क्योंकि ऑब्जेक्ट में जटिल प्रकार (Varien_Db_Select और न ही Zend_Db_Select का कोई __cloneतरीका है)।

इसके आस-पास जाने का एक तरीका है कि चयनित डेटा को सहेजना, उसे संशोधित करना, अपनी क्वेरी चलाना, फिर मूल चयन डेटा को वापस रखना।

एक उदाहरण के लिए यहां देखें: https://ka.lpe.sh/2013/05/23/magento-clone-collection-how-to-clone-collection-in-magento/

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