Skip to main content
3 of 6
add additional problem
Key Shang
  • 3.4k
  • 1
  • 34
  • 59

Magento 2: Order product collection by the order string(skus, ids etc) given, not DESC or ASC

For example, I want collection list in order "sku2,sku1", but it list as "sku1,sku2", because the id of sku1 is smaller. How to achieve it?

Example codes is below:

$skus = 'sku2,sku1';
$collection->addAttributeToSelect('*')
    ->addAttributeToFilter(
        'sku', array('in' => $skus)
    );

Magento 1.x has a way here How to specify custom sort order for product collection?, but it doesn't work on Magento 2:

$collection->getSelect()->order(new Zend_Db_Expr("FIELD(e.sku, $skus)"));

Fatal error: Uncaught Error: Class '.../Zend_Db_Expr' not found in ...

Additional problem (when sku has a dash in it)

Thanks for the answer, the Zend_Db_Expr is working now by add "/" before "Zend_Db_Expr": $collection->getSelect()->order(new /Zend_Db_Expr("FIELD(e.sku, $skus)"));

But when sku has a dash in it, it will result a new question Product collection sort order by custom skus string, when the sku has a hyphen in it, it will result a error , hope someone could answer it.

Key Shang
  • 3.4k
  • 1
  • 34
  • 59