Magento koleksiyonlarını doğal olarak sayfalandırma ile yinelemek mümkün mü?


21

Bununla demek istediğim - yapmanın bir yolu var:

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

Bu şekilde, koleksiyon 100k satır olsa bile, MySQL'den bir seferde yalnızca bir satır sayfa yükler ve onları sahne arkasında sizin için sihirli bir şekilde sayfalandırır.

Bakmak Varien_Data_Collection_Db::load()mümkün gibi görünmüyor, ama sadece kontrol etmek istedi. Bu ortak bir ihtiyaç olması gereken bir şeye benziyor.

Yanıtlar:


18

Gerçekten kullanmalısın

Mage::getSingleton('core/resource_iterator')

Bu amaçla, tamamen sizin bahsettiğiniz performans nedenlerinden dolayı var olduğu gibi.

Aksi takdirde, bir döngü kullanarak biraz daha az zarif bir çözüm kullanabilirsiniz setPageSize- burada iyi bir örnek var, /programming/3786826/how-to-loop-a-magento-collection


1
SIR SIR, bir centilmen ve bilgin.
kalenjordan

+1 setPageSizeçünkü anlamlıdır.
philwinkle

Gerçekleştirdiğim bir diğer şey, core/resource_iteratorçözümün aslında mysql sorgusunu sayfalandırmamasıdır. Ayarlanan tüm sonucu bir kerede yükler, ancak daha sonra PHP kodunuzla ilgilenmeniz için bir satır verir. Bu nedenle PHP içindeki hafıza hatalarını önler, ancak sonuç çok büyükse bir noktada mysql max paket boyutlarını tetikler. SanırımsetPageSize()
kalenjordan

Evet, mwoar puanları peşinden koştum! Gerçekten, sayfalanmış bir koleksiyona karşı tek ürün yüklemesini hedefliyor. Fakat üzerine inşa edilecek bir üs olarak hizmet etmeli.
Ben Lessani - Sonassi

Sorguları MySQL'e harmanlayan, ancak ayrı bir koleksiyon öğesi geri çağırma özelliği sağlayan genel bir toplu yineleyici kullandım. Ne düşündüğünüzü merak ediyorum: gist.github.com/kalenjordan/5483065
kalenjordan

5

Ben Lessani ile , core/iteratorbüyük koleksiyonları mümkünse her defasında bir satır yüklemek için kaynak modelini kullanmanız gerektiğini kabul ediyorum .

Ancak, sınırlamalar vardır. " AddAttributeToSelect, core / resource_iterator ile çalışmıyor mu? " Bölümünde açıklandığı gibi , özellik değerleri tablolarından değerler eklemeniz gerekirse, EAV modelleriyle iyi çalışmaz.

Ve StackOverflow'un bağlantılı örneği aslında o kadar iyi değil çünkü aynı sorguyu farklı LIMITifadelerle tekrarlıyor . Karmaşık sorgular için bu bir performans sorunu olabilir, ancak daha da önemlisi, aralarına yeni satırlar eklenirse çoğaltmalar elde edersiniz.

Parçalardaki koleksiyonları işlemek için daha iyi bir yol ilk önce tüm kimlikleri yüklemek, ardından bu kimlikleri gerçek sayfalanmış toplama için bir filtre olarak kullanmaktır.

Ürünler için basit örnek:

$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());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.