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?

Marty Wallace
la source

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.

Marius
la source
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

Sander Mangel
la source
3

Plus optimisé

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();
Hassan Ali Shahzad
la source
Ceci est également fait par défaut ... voir $this->_getClearSelect().
sv3n