Ce que je veux dire par là, est-il possible de faire:
$collection = $model->getCollection();
foreach ($collection as $item) {
$item->doStuff();
}
De telle manière que même si la collection avait 100 000 lignes, elle ne chargerait qu'une page de lignes à la fois depuis MySQL et les paginerait comme par magie pour vous dans les coulisses.
En regardant Varien_Data_Collection_Db::load()
cela ne semble pas possible, mais je voulais juste vérifier. Cela semble être quelque chose qui devrait être un besoin commun.
performance
collection
kalenjordan
la source
la source
setPageSize
car c'est sémantique.core/resource_iterator
solution ne pagine pas réellement la requête mysql. Il charge l'ensemble du jeu de résultats à la fois, mais il vous donne ensuite une ligne à la fois dans votre code PHP. Donc, cela évite les défauts de mémoire dans PHP, mais à un moment donné, il déclenchera des tailles de paquet max mysql, si l'ensemble de résultats est très grand. Je pense que je vais essayer de construire un gentil résumé de bloc de ressources en utilisantsetPageSize()
Je suis d'accord avec Ben Lessani que vous devez utiliser le
core/iterator
modèle de ressource pour charger les grandes collections une ligne à la fois si possible .Cependant, il y a des limites. Comme expliqué dans « addAttributeToSelect ne fonctionne pas avec core / resource_iterator? », Cela ne fonctionne pas bien avec les modèles EAV si vous devez inclure des valeurs des tables de valeurs d'attribut.
Et l'exemple lié de StackOverflow n'est pas vraiment bon car il répète la même requête avec des
LIMIT
expressions différentes . Pour les requêtes complexes, cela peut être un problème de performances, mais plus important encore, vous obtiendrez des doublons si de nouvelles lignes sont ajoutées entre les deux.Une meilleure façon de gérer les collections en morceaux consiste à charger d'abord tous les ID, puis à utiliser ces ID comme filtre pour la collection paginée réelle.
Exemple simple pour les produits:
la source