2013-02-17 44 views
0

我有產品標籤的數組,我想找到的這些標籤分配給所有的產品(即返回有標籤的所有產品「大」和「紅」)。我目前正在使用以下內容,但不能按預期工作。如何通過Magento中的多個標籤過濾productCollection?

$this->_productCollection = Mage::getResourceModel('tag/product_collection') 
    ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes()) 
    ->addStoreFilter(Mage::app()->getStore()->getId()) 
    ->addMinimalPrice() 
    ->addUrlRewrite() 
    ->setActiveFilter(); 

foreach ($tags as $tagName) { 
    $tagId = Mage::getModel('tag/tag')->loadByName($tagName)->getId(); 
    $this->_productCollection->addTagFilter($tagId); 
} 

看起來addTagFilter()只適用於一次,而不適用於多個標籤。我也曾嘗試

$this->_productCollection->getSelect()->Where('relation.tag_id=?', $tagId); 

但同樣,添加多個Where(relation.tag_id=?, $tagId)不會出現工作。

回答

0

你一定要收集所有標記ID陣列中的那麼

$this->_productCollection->getSelect()->where('relation.tag_id IN (?)', implode(',',$tagId); 
+0

這工作,但不正是我需要的。例如,如果我想獲得分配了「紅色」和「大」標籤的產品,我可能會得到一個只有「紅色」標籤的產品,但不是「大」。我只想要兼得的產品。 – 2013-02-17 22:21:20

+0

是的,這是一個'OR'請求,爲了讓它使用'AND',你需要一些更復雜的東西,我會調查 – dagfr 2013-02-18 07:47:25

+1

你可以嘗試使用第一個標籤獲得所有產品,然後使用其他產品一個(與您嘗試的第一個請求),然後比較集合以獲得兩個集合中的產品 – dagfr 2013-02-18 07:48:51

0

$ prodids =陣列(); //陣列產品ID $標籤名=陣列( 「Awesomeee」, 「黑」); //你的標籤名

     foreach ($tagName as $_tagname) { 
          $tagId=Mage::getModel('tag/tag')->loadByName($_tagname)->getId(); 
          $collections = Mage::getResourceModel('tag/product_collection') 
           ->addAttributeToSelect('sku') 
           ->addAttributeToSelect('name') 
           ->addTagFilter($tagId); 
          $productIDs = $collections->getData(); 

          foreach($productIDs as $_product){ 
           array_push($prodids,$_product['product_id']); 
          } 
         } 


         $collection = Mage::getModel('catalog/product') 
          ->getCollection() 
          ->addAttributeToSelect('*') 
          ->addAttributeToFilter('entity_id', array('in' => $prodids)); 

$ _productCollection = $集合; //最終產品收集

1

我碰到這個非常有趣的問題,來的時候我試圖用VA過濾產品集合泰倫從多選屬性創建的,因爲它,因爲它適用於任何其他屬性沒有工作那麼容易,即

$product_collection->addAttributeToFilter('attribute_code',"some value") 

收集過濾器提供了一個過濾條件「finset」,它可以幫助我們過濾屬性值在一套裏面。

首先,我們需要獲取的屬性的不同值的ID,如下所示:

$attributeOptionArray=array(); 
$opts_attr = Mage::getModel('eav/config')->getAttribute('catalog_product', 'attribute_code'); 
foreach ($opts_attr->getSource()->getAllOptions(true, true) as $option){ 
$attributeOptionArray[$option['value']] = $option['label']; 
} 

接下來,我們需要使用這個數組屬性值的整個產品選項過濾:

$product_collection=Mage::getModel("catalog/product")->getCollection(); 
$product_collection->addAttributeToFilter("attribute_code",array('finset'=>array_search("Some Option's label",$attributeOptionArray))); 

說明:

  1. 首先,我們將產品集合加載到變量

  2. 我們添加「attributeToFilter」,以指定過濾條件。

  3. 隨着array_search條件,我們試圖找到對應選項的標籤的ID。

  4. 通過這個ID與finset條件進行篩選。

希望這會有所幫助。