製品コレクションのカスタムソート順を指定する方法


12

製品IDの配列に基づいて製品コレクションを作成し、ID配列に基づいてコレクションを並べ替えようとしています。

$productIds = array(318,310,311);
$collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->setOrder('entity_id', 'asc') // This will not do the job
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('entity_id', array(
    'in' => $productIds,
        ));

$productIds配列に表示されるように収集されたものをソートしたいのですが318, 310, 311、上記のコードはのようなコレクションソートを返します310,311, 312

以下に示すように、プレーンMySQLクエリを使用せずにこれは可能ですか?

SELECT *
FROM catalog_product_entity
WHERE entity_id IN (318,
                    310,
                    311)
ORDER BY FIELD(entity_id, 318, 310, 311);

回答:


18

悲しいことに、MagentoはVarien_Data_Collection_Db _setOrder機能の順序オプションを検証します。ただし、コレクションの選択を取得し、新しい式を追加して、必要に応じて順序を構築できます。

/* @var $collection Mage_Catalog_Model_Resource_Product_Collection */
$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('status', 1)
    ->addAttributeToFilter('entity_id', array(
            'in' => $productIds,
        ));

$collection->getSelect()->order(new Zend_Db_Expr('FIELD(e.entity_id, ' . implode(',', $productIds).')'));

foreach($collection as $product) {
    var_dump($product->getId());
}

ここで、製品IDが配列の順序になっていることがわかります。


できます!ありがとうございました。SKUによる並べ替えを上記に組み合わせることはできますか?
タヒルヤシン

あなたは構文によって、この順に複数のフィールドを追加することができますFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
デヴィッド・マナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.