2010-12-04 19 views
16

Tengo el siguiente:Magento conseguir productos de la categoría, por orden de rand()

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

Pero necesito ordenar por id RAND(), ¿cómo puedo hacer esto? (El código muestra cómo he intentado sin suerte)

+1

¿No quieres decir que quieres ordenar 'RAND()' en lugar de 'id = RAND()'? ASAIK 'RAND()' devolverá un número entre 0 y 1 – Harmen

+0

Sí, lo siento, tienes razón – Ashley

Respuesta

29

La colección Magento no acepta parámetros distintos a los del atributo seleccionado. En este caso, debe obtener el objeto Zend_Db_Select y agregarle instrucciones de pedido.

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

Para ver lo que la consulta se ejecutará puede utilizar este construnction

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

Tienes un gran conocimiento –

+0

Esta es una respuesta corta para una gran producción ... Muchas gracias .. Tengo un mismo requisito y tu solución funciona mucho .. –

11

Consulte esta pregunta: ¿query magento limit + order by rand() y la respuesta de clockworkgeek:

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

Nice. Pero creo que Andrey lo entendió esta vez. – clockworkgeek

+0

@clockworkgeek - Absolutamente, no estaba tratando de quitarle puntos a Andrey, solo hago un comentario sutil antes de publicar :) Tal vez debería haber sido menos sutil :) –

+0

@JonathanDay Intenté esta solución pero recibí el siguiente error. ¿Alguna idea? Método no reconocido 'setCurPage()' "; i: 1; s: 4108:" # 0 ... \ app \ code \ core \ Mage \ Catalog \ Block \ Product \ List \ Toolbar.php (225): Zend_Db_Select -> __ call ('setCurPage', Array) – Mohit

0

Usando ORDER BY RAND() para devolver una lista de los artículos en orden aleatorio requerirán un escaneo y clasificación completos de la tabla. Puede afectar negativamente el rendimiento en una gran cantidad de filas en la tabla.

Existen varias soluciones alternativas posibles de cómo optimizar esta consulta. Magento proporciona una solución nativa para eso.

El método orderRand() de Varien_Db_Select y el adaptador de base de datos permite especificar un orden aleatorio y un índice de apalancamiento para ORDER BY. Especificar un nombre de algún columna número entero indexadas para ser utilizado en la cláusula ORDER BY, por ejemplo:

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

Ver Varien_Db_Adapter_Pdo_Mysql::orderRand() para detalles de implementación.

+0

Esto funcionó para mí: '$ collection-> getSelect() -> orderRand ('e.entity_id');' Pero, al menos en mi caso, este método no aumentó rendimiento en comparación con el orden '-> (nuevo Zend_Db_Expr ('RAND()'))' –

Cuestiones relacionadas