1

几天来,我一直在尝试获得有关如何按 2 个或更多类别过滤产品集合的干净解决方案。产品应同时属于 A 类和 B 类,而不是其中任何一个。我尝试了多种在互联网上找到的解决方案,但均未成功。到目前为止,我发现的唯一解决方法(但我没有找到)是使用原始查询,然后从 id 中获取集合:

SELECT e.entity_id FROM catalog_product_entity AS e INNER JOIN catalog_category_product AS ccp on ccp.product_id=e.entity_id where ccp.category_id =100 or ccp.category_id = 101 group by entity_id having count(*) > 1

这将返回在类别 100 和 101 中都找到的产品列表。但是,我希望实际上有一种“Magento 方式”或者不需要执行原始查询就可以做到这一点。有人对此有线索吗?

谢谢

4

2 回答 2

4

经过一夜的工作,我终于找到了一个合适的解决方案:

$cat_ids = array(4,5,6);
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
    ->addAttributeToFilter('category_id', array('in' => array('finset' => $cat_ids)))
    ->getSelect()
    ->group('entity_id')
    ->having('count(*) = ' . count($cat_ids));

你去吧。以上将返回同时属于所有提供的类别的所有产品。感谢 activeDev 和 Jurgen 的帮助。

于 2012-08-25T08:00:05.547 回答
0

这应该可以正常工作。

$collection = Mage::getModel('catalog/product')
            ->getCollection()
            ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
            ->addAttributeToFilter('category_id', array('in' => array('finset' => '36,37')))
            ->addAttributeToSelect('*')
            ->setPageSize(5);

这来自http://blog.chapagain.com.np/magento-how-to-filter-product-collection-using-2-or-more-category-filters/,但似乎有点过时了。

我无法确认这是否适用于我正在处理当前不包含类别的版本。但我按预期得到了一个空集合,所以让我知道!

于 2012-08-24T11:49:19.427 回答