ネイティブにページネーションでマゼントコレクションを反復することは可能ですか?

magento.stackexchange https://magento.stackexchange.com/questions/3034

  •  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());
ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top