Можно ли итерация над Magento Collections с национальной на странице?

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

  •  16-10-2019
  •  | 
  •  

Вопрос

Под этим я имею в виду - есть ли способ сделать:

$collection = $model->getCollection();
foreach ($collection as $item) { 
    $item->doStuff();
}

Таким образом, даже если бы в коллекции были 100 тысяч строк, она загрузила только страницу рядов за раз из MySQL и волшебным образом страдает им для вас за кулисами.

От взгляда на Varien_Data_Collection_Db::load() Это не похоже на это возможно, но просто хотел проверить. Это кажется чем -то, что должно быть распространенной потребностью.

Это было полезно?

Решение

Вы действительно должны использовать

Mage::getSingleton('core/resource_iterator')

Для этой цели, поскольку он существует исключительно по причинам производительности, которые вы упомянули.

В противном случае вы можете использовать немного менее элегантное решение, используя петлю с setPageSize - Здесь есть хороший пример, https://stackoverflow.com/questions/3786826/how-to-loop-a-magento-collection

Другие советы

я согласен с Бен Медслони что вы должны использовать core/iterator Модель ресурса для загрузки больших коллекций по одному ряду за раз если возможно.

Однако есть ограничения. Как объяснено в "AddattributeToSelect Не работает с Core/Resource_iterator?«Это не очень хорошо работает с моделями EAV, если вам нужно включить значения из таблиц значений атрибутов.

И связанный пример из StackoverFlow на самом деле не так хорош, потому что он повторяет один и тот же запрос с разными LIMIT выражения. Для сложных запросов это может быть проблемой производительности, но еще более важно, вы получите дубликаты, если между ними будут добавлены новые строки.

Лучший способ обработки коллекций в кусках - сначала загрузить все идентификаторы, а затем использовать эти идентификаторы в качестве фильтра для фактической сбора на страницах.

Простой пример для продуктов:

$ids = Mage::getModel('catalog/product')
    ->getCollection()
    ->getAllIds();

$page = 1;
do {
    $collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->addIdFilter($ids)
        ->setPageSize(100)
        ->setCurPage($page);

    $results = $collection->load();

    // do stuff ......

    $page++;

} while ($results->count());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top