Magento получить товары из категории, заказать по rand()
У меня есть следующее:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSort('id', 'RAND()')
->addAttributeToSelect('small_image')
->addCategoryFilter(Mage::getModel('catalog/category')->load($catId));
Но мне нужно заказать id RAND()
, как я могу это сделать? (Код показывает, как я пытался без везения)
Ответы
Ответ 1
Коллекция Magento не принимает параметры, кроме одного из выбранного атрибута. В этом случае вы должны получить объект Zend_Db_Select
и добавить к нему инструкцию заказа.
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSort()
->addAttributeToSelect('small_image')
->addCategoryFilter(Mage::getModel('catalog/category')->load());
$products->getSelect()->order(new Zend_Db_Expr('RAND()'));
Чтобы узнать, какой запрос будет выполнен, вы можете использовать этот construnction
$products->load(true, true); // first parameter show sql query in output, second show sql query in var/log/syslog
Ответ 2
Обратите внимание на этот вопрос: запрос magento limit + order by rand() и clockworkgeek ответ:
$collection->getSelect()->order(new Zend_Db_Expr('RAND()'));
Ответ 3
Использование ORDER BY RAND()
для возврата списка элементов в случайном порядке потребует полного сканирования и сортировки по таблице. Это может отрицательно повлиять на производительность при большом количестве строк в таблице.
Существует несколько альтернативных вариантов оптимизации этого запроса. Magento предоставляет для этого свое собственное решение.
Метод orderRand()
Varien_Db_Select
и адаптер базы данных позволяют указать индекс случайного порядка и рычага для ORDER BY
.
Укажите имя некоторого целочисленного индексированного столбца, который будет использоваться в предложении ORDER BY
, например:
$collection->getSelect()->orderRand('main_table.entity_id');
Подробнее о деталях реализации см. Varien_Db_Adapter_Pdo_Mysql::orderRand()
.