Question

Ce que je veux dire par là - est-il un moyen de le faire:

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

Dans une telle façon que même si la collection avait 100k lignes, il ne charger une page de lignes à la fois de MySQL et les paginera comme par magie pour vous dans les coulisses.

De regarder Varien_Data_Collection_Db::load() il ne semble pas qu'il est possible, mais je voulais juste vérifier. Cela semble être quelque chose qui devrait être un besoin commun.

Était-ce utile?

La solution

Vous devriez vraiment utiliser

Mage::getSingleton('core/resource_iterator')

à cet effet, car il existe uniquement pour les raisons de performance que vous avez mentionnés.

Dans le cas contraire, vous pouvez utiliser une solution un peu moins élégante en utilisant une boucle avec setPageSize - il y a un bon exemple, https://stackoverflow.com/questions/3786826/how-to-loop-a-magento-collection

Autres conseils

Je suis d'accord avec Ben Lessani que vous devez utiliser le modèle de ressources core/iterator pour charger de grandes collections une ligne à temps si possible .

Cependant, il y a des limites. Comme expliqué dans « addAttributeToSelect ne fonctionne pas avec le noyau / resource_iterator? » ne fonctionne pas bien avec les modèles EAV si vous avez besoin d'inclure les valeurs des tables de valeurs d'attribut.

Et l'exemple lié à partir StackOverflow est en fait pas bon parce qu'il répète la même requête avec des expressions différentes de LIMIT. Pour les requêtes complexes que cela pourrait être un problème de performance, mais plus important encore, vous obtiendrez des doublons si les nouvelles lignes sont ajoutées entre les deux.

Une meilleure façon de collections de poignée en morceaux est d'abord charge tous les ids, utilisent ensuite ces ids comme un filtre pour la collection paginée réelle.

Exemple simple pour les produits:

$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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top