Il modo più efficiente per ottenere tutti gli ID da una raccolta


37

In passato per ottenere tutti gli ID di una raccolta di prodotti, ho sempre usato getAllIdsla raccolta, ritenendo che questo fosse un metodo che impediva il pieno caricamento della raccolta con dati ecc.

Ma oggi ho esaminato il metodo e carica la raccolta e scorre ogni elemento per ottenere l'array ID.

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

La mia domanda è: qual è il metodo più efficiente per recuperare solo il campo ID da una raccolta?

Risposte:


43

In realtà getAllIdsè il modo migliore per farlo. Ad esempio, nel modello delle risorse della raccolta prodotti il ​​metodo è simile al seguente:

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);
}

Quindi tutto viene recuperato da una singola selezione e non è richiesta alcuna iterazione. Anche nel modello di risorsa astratto è simile al seguente:

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);
}

Quindi tutto ciò che si estende Mage_Core_Model_Resource_Db_Collection_Abstractdovrebbe usarlo se non diversamente specificato.

Il metodo che hai visto proviene dalla classe base Varien_Data_Collectionma viene sovrascritto nei suoi figli.


6

In questo caso è possibile utilizzare l'oggetto della raccolta

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

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

addAttributeToSelectperché entity_idnon è veramente richiesto ma per scopi dimostrativi l'ho inserito, aggiungi i campi che ti servono e il gioco è fatto!

Maggiori informazioni sulle raccolte che troverai su questo Wikipage


3

Più ottimizzato

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

Questo viene fatto anche per impostazione predefinita ... vedi $this->_getClearSelect().
sv3n,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.