Le moyen le plus efficace d'obtenir toutes les identifications d'une collection


37

Dans le passé, pour obtenir toutes les identifications d'une collection de produits, je l'avais toujours utilisée getAllIdspour la collection, pensant que c'était une méthode qui empêchait le chargement complet de la collection avec des données, etc.

Mais j’ai en fait examiné la méthode aujourd’hui, qui charge la collection et effectue une itération sur chaque élément pour obtenir le tableau d’ID.

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

Ma question est la suivante: quelle est la méthode la plus efficace pour extraire uniquement le champ ID d’une collection?

Réponses:


43

En fait, getAllIdsc'est la meilleure façon de le faire. Par exemple, dans le modèle de ressource de collection de produits, la méthode se présente comme suit:

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

Donc, tout est récupéré à partir d'une seule sélection et aucune itération n'est requise. Le modèle de ressource abstraite présente également l'aspect suivant:

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

Donc, tout ce qui s'étend Mage_Core_Model_Resource_Db_Collection_Abstractdevrait utiliser ceci sauf indication contraire.

La méthode que vous avez examinée provient de la classe de base, Varien_Data_Collectionmais elle est écrasée dans ses enfants.


6

Dans ce cas, vous pouvez utiliser l'objet de collection

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

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

addAttributeToSelectpour entity_idn'est pas vraiment nécessaire , mais pour démontrer des fins que je l' ai mis dans, ajoutez les champs dont vous avez besoin et vous avez terminé!

Plus sur les collections que vous trouverez sur cette Wikipage


3

Plus optimisé

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

Ceci est également fait par défaut ... voir $this->_getClearSelect().
sv3n
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.