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' не найден...
3
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