Intereting Posts

magento получить товары из категории, заказать по rand ()

У меня есть следующее:

$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() для деталей реализации.