我正在尝试找到两类产品。 我找到了一个示例来获取category1或category2中的产品。 http://www.alphadigital.cl/blog/lang/en-us/magento-filter-by-multiple-categories.html 我需要类别1和类别2中的产品。
博客中的示例是:
class ModuleName_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection{
public function addCategoriesFilter($categories){
$alias = 'cat_index';
$categoryCondition = $this->getConnection()->quoteInto(
$alias.'.product_id=e.entity_id AND '.$alias.'.store_id=? AND ',
$this->getStoreId()
);
$categoryCondition.= $alias.'.category_id IN ('.$categories.')';
$this->getSelect()->joinInner(
array($alias => $this->getTable('catalog/category_product_index')),
$categoryCondition,
array('position'=>'position')
);
$this->_categoryIndexJoined = true;
$this->_joinFields['position'] = array('table'=>$alias, 'field'=>'position' );
return $this;
}
}
当我单独使用此过滤器时,它会对几个类别执行OR查询。 当我将此过滤器与Mage_Catalog_Model_Layer的prepareProductCollection组合在一起时 它以某种方式消除了过滤效果。
如何将过滤器更改为AND并将其与prepareProductCollection结合使用?
由于
由于
答案 0 :(得分:3)
此代码允许您按多个类别进行过滤,但如果必须执行多个集合加载,则应避免完全破坏性能:
$iNumberFeaturedItems = 4;
$oCurrentCategory = Mage::registry('current_category');
$oFeaturedCategory = Mage::getModel('catalog/category')->getCollection()
->addAttributeToFilter('name','Featured')
->getFirstItem();
$aFeaturedCollection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect(array('name', 'price', 'small_image', 'url_key'), 'inner')
->addStoreFilter()
->addCategoryFilter($oFeaturedCategory)
->addCategoryIds();
第一步是获取一个类别的产品集合(在本例中为特色类别)。下一步是获取产品的ID,注意这是 NOT 执行加载(ref Mage_Core_Model_Mysql4_Collection_Abstract::getAllIds()
)
$aFeaturedProdIds = $aFeaturedCollection->getAllIds();
shuffle($aFeaturedProdIds); //randomize the order of the featured products
然后获取第二个类别的ID:
$aCurrentCatProdIds = $oCurrentCategory->getProductCollection()->getAllIds();
与数组相交以查找两个类别中存在的产品ID:
$aMergedProdIds = array_intersect($aFeaturedProdIds,$aCurrentCatProdIds);
对于这个特定的用例,我们循环直到我们有足够的交叉产品,遍历类别树,直到找到足够大的匹配(但在根类别停止!):
while(count($aMergedProdIds) < $iNumberFeaturedItems && $oCurrentCategory->getId() != Mage::app()->getStore()->getRootCategoryId()):
$oCurrentCategory = $oCurrentCategory->getParentCategory();
$aParentCatProdIds = $oCurrentCategory->getProductCollection()->getAllIds();
$aMergedProdIds = array_intersect($aFeaturedProdIds,$aParentCatProdIds);
endwhile;
最后,按交叉产品的ID过滤我们的初始集合,然后返回。
$aFeaturedItems = $aFeaturedCollection->addIdFilter(array_slice($aMergedProdIds,0,$iNumberFeaturedItems))->getItems();
return $aFeaturedItems;
答案 1 :(得分:1)
我也在研究这个无用,它在magento 1.3中使用了category_ids列上的finset属性过滤器,但是这已从实体表移入索引表,现在不再有效了。
有一种可能的解决方案,但需要覆盖功能,我发现here
但这种解决方案远非理想。
答案 2 :(得分:-1)
我认为在您的产品系列上调用addCategoryFilter()两次就足够了 - 每个类别一次。我没有测试过,所以可能是错的。