Как указать пользовательский заказ сортировки для сбора продуктов?

magento.stackexchange https://magento.stackexchange.com/questions/10031

  •  16-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать коллекцию продуктов на основе множества идентификаторов продуктов, а также сортировать коллекцию на основе массива IDS.

$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);
Это было полезно?

Решение

К сожалению, 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());
}

Здесь вы должны увидеть, что идентификаторы продукта находятся в порядке массива.

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