Сортировка коллекции продуктов по ключу массива
-
13-12-2019 - |
Вопрос
Я пытаюсь отсортировать коллекцию продуктов по SKU на основе порядка, в котором SKU появляются в массиве $skus, переданном в метод addAttributeToFilter в коллекции ниже:
$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()
;
Как мне отсортировать эту коллекцию, чтобы продукты отображались в том же порядке, что и их артикулы внутри массива $skus?
Решение
Я сделал что-то подобное, используя функцию 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-структуры таблиц продуктов каждый добавленный атрибут усложнит запрос к базе данных и сделает вызов менее эффективным.