Самый эффективный способ получить все идентификаторы из коллекции

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
[...]

addAttributeToSelectfor на 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