1. ホーム
  2. php

Magento - 特定の属性値を持つ製品を取得する

2023-07-26 10:21:42

質問

私のブロックコードでは、特定の値を持つ属性を持つ製品のリストをプログラム的に取得しようとしています。

それが不可能な場合、どのようにすべての製品を取得し、特定の属性を持つ製品のみをリストするためにそれらをフィルタリングするのでしょうか?

標準的なブーリアンフィルターを使用して、どのように検索を実行すればよいのでしょうか。 AND または OR を使用して、製品のサブセットに一致させることができますか?

どのように解決するのですか?

ほとんどすべての Magento モデルには、対応するコレクションオブジェクトがあり、これを使用してモデルの複数のインスタンスを取得することができます。

Product コレクションをインスタンス化するには、次のようにします。

$collection = Mage::getModel('catalog/product')->getCollection();

ProductsはMagentoのEAVスタイルのモデルなので、返したい属性がある場合は追加で追加する必要があります。

$collection = Mage::getModel('catalog/product')->getCollection();

//fetch name and orig_price into data
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

コレクションにフィルタを設定するには、複数の構文があります。 私はいつも下記の冗長構文を使いますが、Magento のソースを調べて、フィルタリングメソッドのその他の使い方を確認したほうがいいかもしれません。

以下は、値の範囲(より大きい、より小さい)でフィルタリングする方法を示しています。

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

//filter for products whose orig_price is greater than (gt) 100
$collection->addFieldToFilter(array(
    array('attribute'=>'orig_price','gt'=>'100'),
)); 

//AND filter for products whose orig_price is less than (lt) 130
$collection->addFieldToFilter(array(
    array('attribute'=>'orig_price','lt'=>'130'),
));

これは、あるものOR別のものに等しい名前でフィルタリングしますが。

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

//filter for products who name is equal (eq) to Widget A, or equal (eq) to Widget B
$collection->addFieldToFilter(array(
    array('attribute'=>'name','eq'=>'Widget A'),
    array('attribute'=>'name','eq'=>'Widget B'),        
));

サポートされている短い条件文 (eq, lt, など) の完全な一覧は _getConditionSql メソッドにあります。 lib/Varien/Data/Collection/Db.php

最後に、Magento のすべてのコレクションは反復処理できます (ベースコレクションクラスはイテレータインターフェイスのいずれかを実装しています)。 これは、フィルターが設定された後、製品を取得する方法です。

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('name');  
$collection->addAttributeToSelect('orig_price');    

//filter for products who name is equal (eq) to Widget A, or equal (eq) to Widget B
$collection->addFieldToFilter(array(
    array('attribute'=>'name','eq'=>'Widget A'),
    array('attribute'=>'name','eq'=>'Widget B'),        
));

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