Frage

Was ich damit meine, ist - gibt es eine Möglichkeit zu tun:

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

So, dass selbst wenn die Sammlung 100.000 Reihen hatte, sie nur eine Seite mit Zeilen von MySQL von MySQL lädt und sie auf magische Weise für Sie hinter den Kulissen paginiert.

Vom Blick auf Varien_Data_Collection_Db::load() Es scheint nicht möglich zu sein, wollte aber nur überprüfen. Dies scheint etwas zu sein, das ein häufiges Bedürfnis sein sollte.

War es hilfreich?

Lösung

Sie sollten wirklich verwenden

Mage::getSingleton('core/resource_iterator')

Zu diesem Zweck existiert es nur aus den von Ihnen erwähnten Leistungsgründen.

Andernfalls können Sie eine etwas weniger elegante Lösung mit einer Schleife mit verwenden setPageSize - Hier gibt es ein gutes Beispiel, https://stackoverflow.com/questions/3786826/how-to-loop-a-magento-collection

Andere Tipps

Ich bin einverstanden mit Ben Lessani dass Sie die verwenden sollten core/iterator Ressourcenmodell zum Laden großer Sammlungen jeweils eine Zeile wenn möglich.

Es gibt jedoch Einschränkungen. Wie in "erläutert"addatTribUtoSelect funktioniert nicht mit Core/Resource_iterator?"Es funktioniert nicht gut mit EAV -Modellen, wenn Sie Werte aus den Attributwerttabellen einbeziehen müssen.

Und das verknüpfte Beispiel von Stackoverflow ist eigentlich nicht so gut, da es die gleiche Abfrage mit unterschiedlichem wiederholt LIMIT Ausdrücke. Bei komplexen Abfragen könnte dies ein Leistungsproblem sein, aber noch wichtiger, dass Sie Duplikate erhalten, wenn dazwischen neue Zeilen hinzugefügt werden.

Eine bessere Möglichkeit, Sammlungen in Stücken zu behandeln, besteht darin, zuerst alle IDs zu laden und diese IDs als Filter für die tatsächliche PAGED -Sammlung zu verwenden.

Einfaches Beispiel für Produkte:

$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());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top