La forma más eficiente de obtener todas las identificaciones de una colección

37

En el pasado, para obtener todos los ID de una colección de productos, siempre los he usado getAllIdsen la colección, creyendo que este era un método que impedía la carga completa de la colección con datos, etc.

Pero, en realidad, miré el método hoy y carga la colección e itera sobre cada elemento para obtener la matriz de ID.

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

Mi pregunta es, ¿cuál es el método más eficiente para recuperar solo el campo ID de una colección?

Marty Wallace
fuente

Respuestas:

43

En realidad getAllIdses la mejor forma de hacerlo. Por ejemplo, en el modelo de recurso de colección de productos, el método se ve así:

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

Por lo tanto, todo se recupera de una sola selección y no se requiere iteración. También en el modelo de recurso abstracto se ve así:

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

Por lo tanto, todo lo que se extienda Mage_Core_Model_Resource_Db_Collection_Abstractdebe usar esto a menos que se especifique lo contrario.

El método que examinó proviene de la clase base, Varien_Data_Collectionpero se sobrescribe en sus elementos secundarios.

Marius
fuente
6

En este caso, puede usar el objeto de colección

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

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

addAttributeToSelectporque entity_idno es realmente necesario, pero para demostrarlo lo puse, agregue los campos que necesita y ¡listo!

Más sobre las colecciones que encontrarás en este Wikipage

Sander Mangel
fuente
3

Más optimizado

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();
Hassan Ali Shahzad
fuente
Esto también se hace por defecto ... ver $this->_getClearSelect().
sv3n