एक संग्रह से सभी आईडी प्राप्त करने का सबसे कुशल तरीका


37

पूर्व में उत्पाद संग्रह के सभी आईडी प्राप्त करने के लिए, मैंने हमेशा getAllIdsसंग्रह पर उपयोग किया है , यह मानते हुए कि यह एक ऐसी विधि थी जो डेटा के साथ पूर्ण संग्रह लोड को रोकती थी।

लेकिन, मैंने वास्तव में आज विधि को देखा और यह संग्रह को लोड करता है और आईडी सरणी प्राप्त करने के लिए प्रत्येक आइटम पर पुनरावृत्त करता है।

public function getAllIds()
{
    $ids = array();
    foreach ($this->getItems() as $item) {
        $ids[] = $this->_getItemId($item);
    }
    return $ids;
}

मेरा सवाल यह है कि केवल एक संग्रह से आईडी क्षेत्र को पुनः प्राप्त करने के लिए सबसे कुशल तरीका क्या है?

जवाबों:


43

वास्तव में getAllIdsइसे करने का सबसे अच्छा तरीका है। उत्पाद संग्रह संसाधन मॉडल में उदाहरण के लिए विधि इस तरह दिखती है:

public function getAllIds($limit = null, $offset = null)
{
    $idsSelect = $this->_getClearSelect();
    $idsSelect->columns('e.' . $this->getEntity()->getIdFieldName());
    $idsSelect->limit($limit, $offset);
    $idsSelect->resetJoinLeft();

    return $this->getConnection()->fetchCol($idsSelect, $this->_bindParams);
}

तो सब कुछ एक ही चयन से लिया गया है और कोई पुनरावृत्ति की आवश्यकता नहीं है। सार संसाधन मॉडल में भी यह इस तरह दिखता है:

public function getAllIds()
{
    $idsSelect = clone $this->getSelect();
    $idsSelect->reset(Zend_Db_Select::ORDER);
    $idsSelect->reset(Zend_Db_Select::LIMIT_COUNT);
    $idsSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
    $idsSelect->reset(Zend_Db_Select::COLUMNS);

    $idsSelect->columns($this->getResource()->getIdFieldName(), 'main_table');
    return $this->getConnection()->fetchCol($idsSelect);
}

इसलिए जो कुछ भी विस्तारित होता है, Mage_Core_Model_Resource_Db_Collection_Abstractउसका उपयोग तब तक करना चाहिए जब तक कि अन्यथा निर्दिष्ट न हो।

आपके द्वारा देखी गई विधि आधार वर्ग से आती है, Varien_Data_Collectionलेकिन यह अपने बच्चों में लिखी हुई है।


6

इस मामले में आप संग्रह वस्तु का उपयोग कर सकते हैं

$collection = Mage::getModel('catalog/product')->getCollection()
   ->addAttributeToSelect('entity_id');

[...] 
do your loop
[...]

addAttributeToSelectके लिए entity_idवास्तव में आवश्यक नहीं है, लेकिन उद्देश्यों को प्रदर्शित करने के लिए मैंने इसे डाल दिया, उन क्षेत्रों को जोड़ें जिनकी आपको आवश्यकता है और आप कर रहे हैं!

इस विकिपीडिया पर आपको अधिक संग्रह मिलेंगे


3

अधिक अनुकूलित

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();

यह भी डिफ़ॉल्ट रूप से किया जाता है ... देखें $this->_getClearSelect()
sv3n
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.