У меня есть следующее:
$products = Mage::getModel('catalog/product') ->getCollection() ->addAttributeToSort('id', 'RAND()') ->addAttributeToSelect('small_image') ->addCategoryFilter(Mage::getModel('catalog/category')->load($catId));
Но мне нужно заказать id RAND()
, как я могу это сделать? (Код показывает, как я пробовал без везения)
Коллекция 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()'));
Чтобы увидеть, какой запрос будет выполнен, вы можете использовать этот конструкт
$products->load(true, true); // first parameter show sql query in output, second show sql query in var/log/syslog
Обратите внимание на этот вопрос: запрос magento limit + order by rand () и ответ clockworkgeek:
$collection->getSelect()->order(new Zend_Db_Expr('RAND()'));
Использование 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()
для деталей реализации.