Pregunta

Lo que quiero decir con esto es - ¿hay una manera de hacerlo:

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

De tal manera que, incluso si la colección tenía 100k filas, sólo se carga una página de filas a la vez de MySQL y mágicamente paginate para usted detrás de las escenas.

Si buscas en Varien_Data_Collection_Db::load() no parece como que es posible, pero sólo quería comprobar. Esto parece como algo que debería ser una necesidad común.

¿Fue útil?

Solución

Usted realmente debe utilizar

Mage::getSingleton('core/resource_iterator')

para este propósito, ya que existe únicamente por las razones de rendimiento que usted ha mencionado.

De lo contrario, se puede utilizar una solución ligeramente menos elegante usando un bucle con setPageSize - hay un ejemplo bien aquí, https://stackoverflow.com/questions/3786826/how-to-loop-a-magento-collection

Otros consejos

Estoy de acuerdo con Ben Lessani que debe utilizar el modelo de recursos core/iterator para cargar grandes colecciones de fila en fila tiempo de si es posible .

Sin embargo, hay limitaciones. Como se explica en " addAttributeToSelect que no trabajan con núcleo / resource_iterator? " no funciona bien con los modelos EAV si necesita para incluir los valores de las tablas de valores de atributos.

Y el ejemplo enlazado desde StackOverflow no es realmente tan bueno porque se repite la misma consulta con diferentes expresiones LIMIT. Para consultas complejas que 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 colecciones de manejar en trozos es a primera carga todos los identificadores, a continuación, utilizar estos identificadores como un filtro para la recogida paginada real.

Ejemplo sencillo para productos:

$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());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top