2011-01-26 16 views
12

Estoy tratando de ordenar una colección por attribute_id. Pensé que sería fácil, pero creo que no lo estoy usando correctamente:¿Cómo ordenar una colección en Magento?

$attributes = Mage::getResourceModel('eav/entity_attribute_collection') 
    ->setOrder('attribute_id'); 
echo $attributes->getSelect(); 

Resultado:

SELECT `main_table`.* FROM `eav_attribute` AS `main_table` 

Por qué no hay alguna order by?

Respuesta

25

En realidad lo está haciendo de la manera correcta. Sin embargo, dado que Magento usa EAV, necesita aplicar trucos para ayudar al rendimiento.

Uno de estos trucos es el tiempo utilizado para construir la cadena SQL eventual. Por lo general, se carga de forma lenta en el último minuto y no es hasta que realmente indique que desea acceder a los datos de una colección, que puede ver el SQL completo utilizado para producir la colección. Por ejemplo, ejecutar su código, pero hacer que magento realmente construya y cargue la colección, produce el resultado esperado.

$attributes = Mage::getResourceModel('eav/entity_attribute_collection') 
    ->setOrder('attribute_id'); 
$attributes->count(); // forces the collection to load 
echo $attributes->getSelect()->assemble(); 

Esto se traduce en el SQL:

SELECT `main_table`.* FROM `eav_attribute` AS `main_table` ORDER BY attribute_id DESC 

Así que estaban en el camino correcto, simplemente Magento estaba haciendo su mejor esfuerzo para confundir. Es muy bueno en eso.

+0

¡Gracias por la explicación! ¡Muy bueno saber! :) – powtac

+1

el 'setOrder()' da como resultado el orden 'desc'. ¿Hay alguna forma de hacerlo 'asc'? –

+1

-> setOrder ('attribute_id', 'asc'); –

4

Use esto en lugar de $attributes->getSelect();:

$attributes->getSelect()->order('main_table.attribute_id ASC'); 

no preguntes por qué.

+0

No funciona en Magento 1.4.0.0: Método no reconocido 'getSelect()' – frinux

+2

@frinux Su pregunta es acerca de 'getSelect()' – powtac

Cuestiones relacionadas