Vraag magento producten uit de categorie halen, bestellen door rand ()


Ik heb het volgende:

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

Maar ik moet per id bestellen RAND(), hoe kan ik dit doen? (De code laat zien hoe ik heb geprobeerd zonder geluk)


17
2017-12-04 21:48


oorsprong


antwoorden:


De Magento-verzameling accepteert geen andere parameters dan een van de geselecteerde kenmerken. In dit geval zou u moeten krijgen Zend_Db_Select object en voeg er orderinstructie aan toe.

$products = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSort()
    ->addAttributeToSelect('small_image')
    ->addCategoryFilter(Mage::getModel('catalog/category')->load());
$products->getSelect()->order(new Zend_Db_Expr('RAND()'));

Om te zien welke query wordt uitgevoerd, kunt u deze construnction gebruiken

$products->load(true, true); // first parameter show sql query in output, second show sql query in var/log/syslog

30
2017-12-04 22:13



Verwijs naar deze vraag: query magento limit + order by rand ()  en clockworkgeeks antwoord:

$collection->getSelect()->order(new Zend_Db_Expr('RAND()'));

11
2017-12-04 23:32



Gebruik makend van ORDER BY RAND() om een ​​lijst met items in een willekeurige volgorde te retourneren, moet een volledige tabel worden gescand en gesorteerd. Dit kan de prestaties van een groot aantal rijen in de tabel negatief beïnvloeden.

Er zijn verschillende alternatieve oplossingen mogelijk voor het optimaliseren van deze vraag. Magento biedt hiervoor een systeemeigen oplossing.

De orderRand() methode van Varien_Db_Select en de database-adapter maakt het mogelijk om een ​​willekeurige volgorde en leverage-index op te geven voor ORDER BY. Geef een naam op van een index met een geheel aantal geïndexeerde kolommen die moet worden gebruikt in de ORDER BY clausule, bijvoorbeeld:

$collection->getSelect()->orderRand('main_table.entity_id');

Zien Varien_Db_Adapter_Pdo_Mysql::orderRand() voor implementatiedetails.


1
2018-03-06 15:00