1

残念ながら、私は現在、このコードをテストする手段を持っていませんが、結果がどうなるか、舞台裏で実行される操作の順序をコミュニティに尋ねたかったのです. これは、フロントエンドの製品をシャッフルしてロードする (操作順序は不明) 短い PHP コードです。(A と B は、この投稿で参照するためのラベルです)

A. $productCollection = Mage::getModel('catalog/product')->getCollection()
    ->setPageSize(10)
    ->addAttributeToSort('entity_id', 'DESC');

B. if ($sortType == 'shuffle') {
    $productCollection->getSelect()->order(new Zend_Db_Expr('RAND()'));
}

私の質問は、これは でクエリを設定しSELECTA.クエリ文字列に順序のランダム化を追加して でクエリB.を実行するとB.、同じ 10 個の製品がランダムな順序で読み込まれることになりますか?

私が尋ねている理由は、私たちのサイトで実行されている以下の (簡略化された) コードでは、常に 10 個の異なるアイテムがランダムな順序で読み込まれるためです。コードが実行される順序を見ると、上で説明したように思えます。$productCollectionアイテムがすでにロードされているため、この後は反復できることに注意してください。を省略するD.と、最新の 10 個の製品/エンティティ ID のみが取得されます。

C.単独で製品をロードする方法は明確ではありませんD.が、既にロードされているものをさかのぼって変更できます。

C. $productCollection = Mage::getModel('catalog/product')->getCollection()
    ->setPageSize(10)
    ->addAttributeToFilter('visibility', 3)
    ->addAttributeToFilter('news_from_date', array('gteq' => $date));

D.     if ($sortType == 'shuffle') {
    $productCollection->getSelect()->order(new Zend_Db_Expr('RAND()'));
}
4

1 に答える 1

2

ランダム順序句は、最初にコレクション オブジェクトに設定する必要があります。ただし、私が間違っていない限り、あなたの条件AとBは一緒に使用された場合に排他的です. おそらく、どちらかまたは両方のアプローチを使用するとうまくいくでしょうか?

$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection->setPageSize(10);

if ($sortType == 'shuffle') {
    $productCollection->getSelect()->orderRand(); //wrapper; entity_id is implicit
} else {
    $productCollection->setOrder('entity_id'); //desc is default
}

2 つの呼び出しが異なり、entity_idフィールドが最初のorder列として追加されている場合、ランダムな順序を設定する前に select オブジェクトの一部をリセットする必要がorderあります。この場合、パーツ B は次のようになります。

if ($sortType == 'shuffle') {
    $productCollection->getSelect()->reset(Zend_Db_Select::ORDER);
    $productCollection->getSelect()->orderRand();
}

編集 - 私はあなたの質問を読み直しました.次の点を追加してください. 次のようなことができます。

$items = $productCollection->getItems();
shuffle($items);

その後、$items 配列を操作します。

事後編集 - OP編集対応

C.&について- コレクションクラスは必要になるまで何もD.しません。またはこれをトリガーするload()コードはありません。ただし、次のいずれかを実行すると、クエリ、結果の取得、およびモデル インスタンスの割り当てがトリガーされます。C.D.

count($productCollection);
foreach($productCollection as $product){/*...*/};
$productCollection->getColumnValues();
$productCollection->getFirstItem();
$productCollection->getItemByColumnValue();
$productCollection->getItems();
$productCollection->getItemsByColumnValue();
$productCollection->getIterator();
$productCollection->getLastItem();
$productCollection->getSize();
$productCollection->load();
$productCollection->loadData();

IteratorAggregate注意 - 最初の 2 つは、とCountableからインターフェイスを継承するコレクション クラスの副作用ですVarien_Data_Collection

参考までに、コレクション クラスがload()編集されたらclear()、クエリを再発行するために編集する必要があります。

于 2013-05-28T23:28:39.377 に答える