Вопрос

Я пытаюсь отсортировать коллекцию продуктов по 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-структуры таблиц продуктов каждый добавленный атрибут усложнит запрос к базе данных и сделает вызов менее эффективным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top