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

magento.stackexchange https://magento.stackexchange.com/questions/9105

  •  16-10-2019
  •  | 
  •  

Pregunta

En el pasado para obtener todas las identificaciones de una colección de productos, siempre he usado getAllIds En la colección, creyendo que este era un método que evitaba la carga de recolección completa 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 identificación.

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 de identificación de una colección?

¿Fue útil?

Solución

Realmente getAllIds es la mejor manera de hacerlo. Por ejemplo, en el modelo de recursos 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 recursos abstractos 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);
}

Entonces todo lo que se extiende Mage_Core_Model_Resource_Db_Collection_Abstract debe usar esto a menos que se especifique lo contrario.

El método que miró proviene de la clase base Varien_Data_Collection Pero se sobrescribe en sus hijos.

Otros consejos

En este caso puede usar el objeto de recolección

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

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

addAttributeToSelect por entity_id No es realmente obligatorio, pero para fines de demostración lo pongo, agregue los campos que necesita y ¡ya está!

Más sobre colecciones que encontrarás En este wikipage

Más optimizado

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top