ネイティブにページネーションでマゼントコレクションを反復することは可能ですか?
-
16-10-2019 - |
質問
私がそれを意味するのは、する方法があることです:
$collection = $model->getCollection();
foreach ($collection as $item) {
$item->doStuff();
}
コレクションに100kの列があったとしても、MySQLから一度に1列のページをロードし、魔法のように舞台裏で魔法のようにページングします。
見てから Varien_Data_Collection_Db::load()
それは可能ではないようですが、ただチェックしたかっただけです。これは一般的なニーズであるべきもののようです。
解決
本当に使用する必要があります
Mage::getSingleton('core/resource_iterator')
この目的のために、それはあなたが言及したパフォーマンスの理由で純粋に存在するためです。
それ以外の場合は、ループを使用してややエレガントなソリューションを使用できます setPageSize
- ここに良い例があります、 https://stackoverflow.com/questions/3786826/how-to-loop-a-magento-collection
他のヒント
私は同意します ベン・レッカーニ あなたが使用する必要があること core/iterator
大きなコレクションを一度に1列目にロードするリソースモデル もし可能なら.
ただし、制限があります。で説明されているように」addattributetoselect core/resource_iteratorで動作しませんか?「属性値テーブルの値を含める必要がある場合、EAVモデルではうまく機能しません。
そして、StackoverFlowからのリンクされた例は、実際にはそれほど良くありません。 LIMIT
表現。複雑なクエリの場合、これはパフォーマンスの問題になる可能性がありますが、さらに重要なことは、その間に新しい行が追加された場合に重複することになります。
チャンクでコレクションを処理するより良い方法は、最初にすべてのIDをロードしてから、これらのIDを実際のページコレクションのフィルターとして使用することです。
製品の簡単な例:
$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());