Подтвердить что ты не робот

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

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

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSort('id', 'RAND()')
    ->addAttributeToSelect('small_image')
    ->addCategoryFilter(Mage::getModel('catalog/category')->load($catId));

Но мне нужно заказать id RAND(), как я могу это сделать? (Код показывает, как я пытался без везения)

4b9b3361

Ответ 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

Ответ 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().