Lo que quiero decir con eso es: ¿hay alguna manera de hacerlo?
$collection = $model->getCollection();
foreach ($collection as $item) {
$item->doStuff();
}
De tal manera que incluso si la colección tuviera 100k filas, solo cargaría una página de filas a la vez desde MySQL y mágicamente las paginaría detrás de escena.
De su análisis Varien_Data_Collection_Db::load()
no parece como que es posible, pero sólo quería comprobar. Esto parece algo que debería ser una necesidad común.
performance
collection
kalenjordan
fuente
fuente
setPageSize
porque es semántico.core/resource_iterator
solución en realidad no pagina la consulta mysql. Carga todo el conjunto de resultados a la vez, pero luego le da una fila a la vez para tratar en su código PHP. Por lo tanto, evita fallas de memoria dentro de PHP, pero en algún momento activará el tamaño máximo de paquetes mysql, si el conjunto de resultados es muy grande. Creo que voy a tratar de construir un buen resumen de recursos en pedazos usandosetPageSize()
Estoy de acuerdo con Ben Lessani que se debe utilizar el
core/iterator
modelo de recursos para cargar grandes colecciones de una fila a la vez , si es posible .Sin embargo, hay limitaciones. Como se explica en " addAttributeToSelect no funciona con core / resource_iterator? ", No funciona bien con los modelos EAV si necesita incluir valores de las tablas de valores de atributos.
Y el ejemplo vinculado de StackOverflow en realidad no es tan bueno porque repite la misma consulta con diferentes
LIMIT
expresiones. Para consultas complejas, esto podría ser un problema de rendimiento, pero aún más importante, obtendrá duplicados si se agregan nuevas filas en el medio.Una mejor manera de manejar colecciones en trozos es cargar primero todos los identificadores, luego usar estos identificadores como filtro para la recopilación paginada real.
Ejemplo simple para productos:
fuente