Forma más eficiente de obtener todas las identificaciones de una colección
-
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?
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();