Найефективніший спосіб отримати всі ідентифікатори з колекції


37

Раніше для отримання всіх ідентифікаторів колекції продуктів я завжди використовував getAllIdsцю колекцію, вважаючи, що це метод, який запобігав повному завантаженню даних колекцією з даними тощо.

Але я сьогодні переглянув метод, і він завантажує колекцію та повторює кожен елемент, щоб отримати масив ідентифікаторів.

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

Моє запитання: який найефективніший спосіб отримати лише колекційне поле з колекції?

Відповіді:


43

Насправді getAllIdsце найкращий спосіб зробити це. Наприклад, у моделі ресурсу колекції продуктів метод виглядає так:

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

Таким чином, все витягується з одного вибору, і ітерація не потрібна. Також в абстрактній моделі ресурсів це виглядає так:

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

Тому все, що розширюється, Mage_Core_Model_Resource_Db_Collection_Abstractмає використовувати це, якщо не вказано інше.

Метод, який ви подивилися, походить із базового класу, Varien_Data_Collectionале він перезаписаний у своїх дітей.


6

У цьому випадку ви можете використовувати об’єкт колекції

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

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

addAttributeToSelectдля entity_idнасправді не потрібно, але для демонстраційних цілей я вкладаю його, додаю потрібні поля, і ви готові!

Більше про колекції ви знайдете на цій Вікі-сторінці


3

Більш оптимізований

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->getSelect()->reset(Zend_Db_Select::COLUMNS);
$collection->getSelect()->columns('entity_id');
$collection1Ids[] = $collection->getAllIds();

Це також робиться за замовчуванням ... див $this->_getClearSelect().
sv3n
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.