Як вказати спеціальний порядок сортування для збору товару?


12

Я намагаюся створити колекцію продуктів на основі масиву ідентифікаторів продуктів, а також сортую колекцію на основі масиву id.

$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);

Відповіді:


18

На жаль, 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());
}

Тут ви повинні побачити, що ідентифікатори продукту є в порядку масиву.


Це працює! Дякую. Чи можемо ми поєднати сортування за SKU до вище?
Тахір Ясін

Ви можете додати до цього замовлення кілька полів за синтаксисомFIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
David Manners
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.