アレイキーで製品コレクションを並べ替えます
-
13-12-2019 - |
質問
下記のコレクションで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構造のために、追加された各属性はデータベースクエリに複雑さを追加し、呼び出しを効率的に効率的にします。
所属していません magento.stackexchange