Rozumiem przez to - czy istnieje sposób na:
$collection = $model->getCollection();
foreach ($collection as $item) {
$item->doStuff();
}
W taki sposób, że nawet jeśli kolekcja ma 100 tys. Wierszy, ładuje tylko stronę wierszy naraz z MySQL i magicznie dzieli je na strony za kulisami.
Patrząc na Varien_Data_Collection_Db::load()
to nie wydaje się możliwe, ale po prostu chciałem to sprawdzić. To wydaje się być czymś, co powinno być powszechną potrzebą.
performance
collection
kalenjordan
źródło
źródło
setPageSize
ponieważ jest semantyczna.core/resource_iterator
rozwiązanie faktycznie nie dzieli stronicowania zapytania mysql. Ładuje cały zestaw wyników naraz, ale następnie daje ci wiersz do zrobienia w kodzie PHP. Dzięki temu unika się błędów pamięci w PHP, ale w pewnym momencie wyzwoli maksymalne rozmiary pakietów mysql, jeśli zestaw wyników jest bardzo duży. Myślę, że spróbuję zbudować ładny abstrakcyjnysetPageSize()
Zgadzam się z Benem Lessani , że należy używać
core/iterator
modelu zasobów, aby ładować duże kolekcje jeden wiersz na raz, jeśli to możliwe .Istnieją jednak ograniczenia. Jak wyjaśniono w „ addAttributeToSelect nie działa z core / resource_iterator? ”, Nie działa dobrze z modelami EAV, jeśli chcesz dołączyć wartości z tabel wartości atrybutów.
A połączony przykład StackOverflow nie jest tak dobry, ponieważ powtarza to samo zapytanie z różnymi
LIMIT
wyrażeniami. W przypadku złożonych zapytań może to być problem z wydajnością, ale co ważniejsze, otrzymasz duplikaty, jeśli pomiędzy nimi zostaną dodane nowe wiersze.Lepszym sposobem obsługi kolekcji w porcjach jest najpierw załadowanie wszystkich identyfikatorów, a następnie użycie tych identyfikatorów jako filtrów dla faktycznej kolekcji stronicowanej.
Prosty przykład dla produktów:
źródło