質問

下記のコレクションでadattributeToFilterメソッドに渡された$ SKUSARRETメソッドにSKUが表示される順序に基づいて、SKUによる製品コレクションをソートしようとしています。

    $skus = explode(",",$this->getRequest()->getParam('skus'));

    $collection = Mage::getModel('catalog/product')->getCollection()
                    ->addAttributeToSelect('*')
                    ->addAttributeToFilter('sku',array('in'=>$skus))
                    ->addAttributeToFilter('visibility',array('gt'=>array(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE)))
                    ->addAttributeToFilter('status',array('eq'=> Mage_Catalog_Model_Product_Status::STATUS_ENABLED))
                    ->addUrlRewrite()
    ;
.

製品が$ SKUのアレイ内のSKUと同じ順序で表示されるように、このコレクションを並べ替える方法は?

役に立ちましたか?

解決

MySQL FIELD()関数を使用して似たようなものをしました。多分それはまたここにあなたを助けることができます。

コレクションに他のフィルタを追加したら、これを呼び出します。

$collection->getSelect()->order(new Zend_Db_Expr('FIELD(sku, "' . implode('","', $skus) . '") DESC'));
.

他のヒント

Mage::getModel('catalog/product')->getCollection()またはMage::getResourceModel('catalog/product_collection')を使用してコレクションを作成するとき、メインコレクションテーブルはcatalog_product_entityです。このテーブルには、メインテーブル内のこの列でフィルタとソートの両方が最も効率的であるため、索引付けされているsku列が含まれています。これはあなたに何かを与えるでしょう:

$collection = Mage::getResourceModel('catalog/product_collection');
$collection
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('visibility',array('gt'=>array(Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE)))
    ->addAttributeToFilter('status',array('eq'=> Mage_Catalog_Model_Product_Status::STATUS_ENABLED))
    ->addUrlRewrite();

$collection->getSelect()
    ->where('sku IN (?)', $skus)
    ->order('sku DESC');
.

あなたがすでにSKUによってフィルタリングされているので、コレクションを注文するために何かを注文する必要はありません。

私はまた、必要な属性だけを追加するだけでなく、->addAttributeToSelect('*')もお勧めします。製品テーブルのEAV構造のために、追加された各属性はデータベースクエリに複雑さを追加し、呼び出しを効率的に効率的にします。

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top