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?

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.


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


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

Esto también se hace por defecto ... ver $this->_getClearSelect().
sv3n
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.