Magento 2: Пользовательский порядок сортировки для коллекции продуктов (артикулы, идентификаторы и т.д.)


Например, мне нужен список коллекций в порядке "артикул 2, артикул 3, артикул 1", это не простой порядок DESC или ASC. Как этого достичь?

Примеры кодов приведены ниже:

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

В Magento 1.x есть способ здесь Как указать пользовательский порядок сортировки для коллекции продуктов?, но это не работает в Magento 2:

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

Неустранимая ошибка: Неперехваченная ошибка: Класс '.../Zend_Db_Expr' не найден...

Author: Key Shang, 2017-09-01

2 answers

Вы можете сделать в magento 2, как показано ниже, используя \Zend_Db_Expr

$collection->getSelect()->order(new \Zend_Db_Expr('FIELD(e.entity_id, ' . implode(',', $skus).')'));
 5
Author: Rakesh Jesadiya, 2017-09-01 04:49:08

Тип номера (например, идентификаторы и т.д.)

$ids = '4,5,3,1,2';
$collection = ...; // get the collection
$collection->getSelect()->order(new \Zend_Db_Expr("FIELD(entity_id,$ids)"));

entity_id это имя столбца, который вы хотите отсортировать, вам нужно изменить его, когда он находится в другой коллекции, например page_id, block_id, banner_id и т.д.

Строковый тип (например, артикулы и т.д.)

$ids = 'sku4,sku5,sku3,sku1,sku2';
$collection = ...; // get the collection
$skus = "'" . str_replace(",", "','", $skus) . "'"; //need process string
$collection->getSelect()->order(new \Zend_Db_Expr("FIELD(sku,$skus)"));

Числовой тип используйте решение "Строковый тип" тоже работает, но я думаю, что это не подходит.

 2
Author: Key Shang, 2017-10-28 01:37:19