제품 콜렉션에 대한 사용자 정의 정렬 순서를 지정하는 방법은 무엇입니까?


12

제품 ID 배열을 기반으로 제품 컬렉션을 만들고 id 배열을 기반으로 컬렉션을 정렬하려고합니다.

$productIds = array(318,310,311);
$collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->setOrder('entity_id', 'asc') // This will not do the job
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('entity_id', array(
    'in' => $productIds,
        ));

$productIds배열에 나타나는 것처럼 수집 된 정렬을 원 318, 310, 311하지만 위의 코드는와 같은 컬렉션 정렬을 반환 310,311, 312합니다.

아래 주어진 일반 MySQL 쿼리를 사용하지 않고도 가능합니까?

SELECT *
FROM catalog_product_entity
WHERE entity_id IN (318,
                    310,
                    311)
ORDER BY FIELD(entity_id, 318, 310, 311);

답변:


18

슬프게도 Magento는 주문 옵션 Varien_Data_Collection_Db _setOrder기능을 검증합니다 . 그러나 컬렉션을 선택하고 새 식을 추가하여 원하는대로 순서를 작성할 수 있습니다.

/* @var $collection Mage_Catalog_Model_Resource_Product_Collection */
$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect('*')
    ->addAttributeToFilter('status', 1)
    ->addAttributeToFilter('entity_id', array(
            'in' => $productIds,
        ));

$collection->getSelect()->order(new Zend_Db_Expr('FIELD(e.entity_id, ' . implode(',', $productIds).')'));

foreach($collection as $product) {
    var_dump($product->getId());
}

여기서 제품 ID가 배열 순서대로되어 있음을 알 수 있습니다.


효과가있다! 감사합니다. SKU를 기준으로 정렬 할 수 있습니까?
Tahir Yasin

구문에 FIELD(x, 1, 2, 3), FIELD(y, 3, 2, 1)
따라이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.