5

Magento には、選択ドロップダウン オプションである cl_designer という属性があります。次のように、製品コレクションをフィルタリングしたいと思います。

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('cl_designer', array('like' => $filter));

しかし、それはうまくいきません!$collection->getselect() でクエリを出力すると、$filter と catalog_product_entity_int.value が比較されていることがわかります。ただし、選択オプションの場合、catalog_product_entity_int.value は値ではなく option_id であるため、これは間違っています。では、実際のオプション値でフィルタリングするにはどうすればよいでしょうか?

4

2 に答える 2

8

という名前のドロップダウン属性の例sizeには、次のオプションが含まれていると仮定します。

id    value
22    'small'
23    'medium'
24    'large'

'medium'コレクションをオプションでフィルタリングします。

ドロップダウン オプションの値でフィルタ

商品の (カスタム) ドロップダウン属性のオプション値で商品コレクションをフィルタリングするには:

$sAttributeName = 'size';
$mOptionValue = 'medium';
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter(
        $sAttributeName,
        array(
            'eq' => Mage::getResourceModel('catalog/product')
                        ->getAttribute($sAttributeName)
                        ->getSource()
                        ->getOptionId($mOptionValue)
        )
    );

ドロップダウン オプション ID でフィルタ

商品の (カスタム) ドロップダウン属性のオプション ID で商品コレクションをフィルタリングするには:

$sAttributeName = 'size';
$mOptionId = 23;
$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('*')
    ->addFieldToFilter(
        $sAttributeName,
        array('eq' => $mOptionId)
    );
于 2013-02-09T09:54:55.213 に答える
2

要するに、次のようになります。

$collection->
    addAttributeToFilter(
        array(
            array('attribute' => 'cl_designer', 'eq' => ''),
            array('attribute' => 'cl_designer', 'neq' => '')
        ))->
    joinTable(array('cl_designer_value'=>'eav_attribute_option_value'),'option_id = cl_designer', array('cl_designer_value' => 'value'))->
    addAttributeToFilter('cl_designer_value', array('like' => $filter));

最初の addAttributeToFilter は、適切な catalog_product_entity_int テーブルを含め、entity_id、attribute_id、および store_id によって適切に結合するために必要です。次に、joinTable を使用して eav_attribute_option_value に接続します。

joinTable は複雑です。最初の引数は、フォーム alias => tablename の、結合するテーブルの配列です。テーブル名は生の名前 (ここのように) または標準のマジェント スラッシュ表記にすることができます。2 番目の引数は、「primary=attribute」という形式の文字列です。= の左側にあるものは、結合に使用するこのテーブルの列であると見なされ、= の後にあるものは属性コードであると見なされます。次に、指定された属性コードを結合で使用する適切な table.column に変換しますが、テーブルが見つからない場合は追加しません。そのため、最初の addAttributeToFilter が必要でした。

joinTable の次の引数も必要で、これは alias => column という形式の配列であり、その各エントリはエイリアスによって参照できます。 cl_designer_value.value (tablealias.column) を cl_designer_value として参照できます。

joinTable の後、cl_designer_value を他の属性コードとして扱い、通常どおり使用できるようになりました。

joinTable は属性コードによってテーブルを結合することに注意してください。ただし、テーブルを結合すると、fields 配列 (3 番目の引数) で指定した属性コードが次の結合で使用できるようになります。そのため、必要に応じて joinTable への複数の呼び出しを連鎖させることができます。

于 2013-02-08T18:02:31.933 に答える