Как указать пользовательский заказ сортировки для сбора продуктов?
-
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());
}
Здесь вы должны увидеть, что идентификаторы продукта находятся в порядке массива.
Не связан с magento.stackexchange