7

IDの配列を使用してMagentoコレクションをフィルタリングすることはできますが、コレクションの結果は、フィルターに渡されたIDの順序で並べ替えられます。

例えば:

$collection = Mage::getModel('catalog/product')
                  ->getCollection()
                  ->addAttributeToFilter('entity_id', array(
                       'in' => array(1, 3, 2),
                   ));

コレクションをループすると、特定の順序で商品が出てくるように、コレクションに1、3、2の順序で商品を配置したいと思います。

私が現在持っている唯一の選択肢は、製品の配列を手動で作成することです。

$productIds = array(1,3,2);
$collection = array();

foreach($productIds as $productId) {
    $collection[] = Mage::getModel('catalog/product')->load($productId);
}

これは明らかに機能しますが、これを行うには醜い方法のようです。

純粋にmagentoコレクションを介してこれを行う方法はありますか?

4

4 に答える 4

12
$productIds = array(1,3,2);

/**
 * Build up a case statement to ensure the order of ids is preserved
 */
$orderString = array('CASE e.entity_id');
foreach($productIds as $i => $productId) {
    $orderString[] = 'WHEN '.$productId.' THEN '.$i;
}
$orderString[] = 'END';
$orderString = implode(' ', $orderString);

/**
 * Filter the collection
 */
$productCollection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('entity_id', array('in' => $productIds));

/**
 * Apply the order based on the case statement
 */
$productCollection->getSelect()
    ->order(new Zend_Db_Expr($orderString))
于 2012-07-23T11:48:33.577 に答える
1

PHPで並べ替える前に、コレクションをロードできます。例:

$result = array();
$productIds = array(1,3,2);
$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToFilter('entity_id', array('in' => $productIds))
    ->load();

foreach ($productIds as $productId) {
    if ($product = $collection->getItemById($productId)) {
        $result[$productId] = $product;
    }
}

それ以外の場合、純粋にコレクションを使用する場合は、最初にZend_Db_Selectコレクションのオブジェクトを通過して、式を並べ替えることができます(たとえば、EAVベースのコレクションやaddAttributeToSortまたはへの呼び出しでは不可能な場合がありますsortOrder)。
次にorder、Gershonの回答に記載されているように複数の呼び出しを使用するかorder、生成されたCASE WHEN THENステートメントで単一の呼び出しを使用できます。フィルタリングする必要のあるIDの最大数に依存する可能性があることを知っています。

于 2012-07-18T07:44:11.010 に答える
0

これは難しい質問です。これが機能するはずの解決策です。

$collection = Mage::getModel('catalog/product')
                  ->getCollection()
                  ->addAttributeToFilter('entity_id', array(
                       'in' => array(1928, 1930, 1929),
                   ))
           ->addAttributeToSort('entity_id = 1928', 'ASC')
           ->addAttributeToSort('entity_id = 1930', 'ASC')
           ->addAttributeToSort('entity_id = 1929', 'ASC')
           ;
于 2012-07-17T21:39:15.230 に答える