简体   繁体   中英

How to sort a collection in Magento?

I'm trying to sort a collection by attribute_id . I thought it would be easy, but I think I'm not using it correctly:

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

Result:

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

Why isn't there any order by ?

You're actually doing it the right way. However, since Magento uses EAV, it needs to apply tricks to help performance.

One of these tricks is the timing used to build the eventual SQL string. Usually it's lazily loaded at the last minute and it's not until you actually indicate you want to access a collection's data, that you can see the full SQL used to produce the collection. For example running your code, but prompting magento to actually construct and load the collection, produces the expected output.

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

This results in the SQL:

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

So you were on the right path, just Magento was doing its level best to confuse you. It's very good at that.

Use this instead of $attributes->getSelect(); :

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

Don't ask why.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM