Php 如何在Magento中通过多个标记筛选productCollection?

Php 如何在Magento中通过多个标记筛选productCollection?,php,magento,Php,Magento,我有一系列产品标签,我想找到所有分配了这些标签的产品(即返回所有标签为“大”和“红色”的产品)。我目前正在使用以下工具,但它没有按预期工作 $this->_productCollection = Mage::getResourceModel('tag/product_collection') ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes()) -

我有一系列产品标签,我想找到所有分配了这些标签的产品(即返回所有标签为“大”和“红色”的产品)。我目前正在使用以下工具,但它没有按预期工作

$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);

但是,在其中添加多个
(relation.tag\u id=?,$tagId)
似乎不起作用。

您必须收集数组中的所有标记id

$this->_productCollection->getSelect()->where('relation.tag_id IN (?)', implode(',',$tagId);
$prodids=array()//产品ID数组 $tagName=array(“Awesomeee”、“Black”)//你的标签名

                        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));

$\u productCollection=$collection//最终产品集合

我遇到了一个非常有趣的问题,当时我正试图使用创建的多选属性中的值筛选产品集合,因为它不像对任何其他属性(即

$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)));
说明:

  • 首先,我们将产品集合加载到一个变量

  • 我们添加了“attributeToFilter”,以指定过滤条件

  • 使用array_搜索条件,我们尝试查找与选项标签对应的id

  • 将此id传递给具有finset条件的筛选器


  • 希望这能有所帮助。

    这是可行的,但并不完全符合我的需要。例如,如果我想获得分配了“红色”和“大”标签的产品,我可能会得到一个只有“红色”标签但没有“大”标签的产品我只想要同时具有这两个标签的产品。是的,这是一个“或”请求,要使用“和”,您需要更复杂的东西,我将进行调查。您可以尝试获取带有第一个标签的所有产品,然后获取带有另一个标签的所有产品(带有您尝试的第一个请求)然后比较集合以获取两个集合中的产品解决方案是获取所有带tag1的产品、所有带tag2的产品,然后将这两个集合中的产品分离出来吗?您可以使用“array_intersect”函数获取两个结果中的产品。$array1=带tag1的getproduct,$array2=带tag2的getproduct,$array3=数组相交($array1,$array2);