Magento的。使用组合的AND / OR过滤器从多个类别中获取产品

时间:2014-10-13 11:28:09

标签: database magento

我试图按类别和OR同时过滤产品。

我们说我有类别 SALE TESTWINNER FRUITS VEGETABLES 。我想从 FRUITS VEGETABLES 类别中获取 SALE TESTWINNERS 上的产品。

所以类别伪过滤器如下:
(SALE TESTWINNER)(水果蔬菜)

我试图通过以下方式实现这一目标:

   $collection = Mage::getModel('catalog/product')
            ->getCollection()
            ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
            ->addAttributeToSelect('*');

   $catsSaleWinner = [$saleId, $winnerId];
   $catsFruitVeg = [$fruitId, $vegId];
   $collection->addAttributeToFilter('category_id', array('in' => $catsSaleWinner));
   $collection->addAttributeToFilter('category_id', array('in' => $catsFruitVeg));
   $collection->getSelect()->group('e.entity_id');


Magento创建的mysql查询似乎应该是:

SELECT `e`.*, `at_category_id`.`category_id` FROM `catalog_product_entity` AS `e`
LEFT JOIN `catalog_category_product` AS `at_category_id` ON (at_category_id.`product_id`=e.entity_id)
WHERE (at_category_id.category_id IN('45', '47')) AND (at_category_id.category_id IN('41', '43')) GROUP BY `e`.`entity_id`

由于某种原因,结果是空的。没有产品退回。

如果我尝试将fruitVeg类别过滤掉,它会正确返回SALE和WINNERS 如果我尝试退出saleWinner类别过滤器,它会正确返回FRUITS和VEGETABLES。

所以OR部分工作正常,但AND部分没有。

我已经和这个问题搏斗了几天。我不知道下一步该尝试什么,可能是什么问题。非常感谢任何帮助。

这是我关于stackoverflow的第一个问题,所以请原谅我礼仪上的任何错误。

2 个答案:

答案 0 :(得分:0)

我认为问题在于,您的联接会创建一个结果,其中每个产品类别组合都有自己的行但具有单一的类别ID,因此(at_category_id.category_id IN('45', '47')) AND (at_category_id.category_id IN('41', '43')根本无法找到同时满足这两个条件的行

可能最好放弃加入,而是使用->getCategoryIds()并迭代。

答案 1 :(得分:0)

你几乎已经有了完整的答案,唯一的区别是你必须将两组类别分成单独的字段。

$collection = Mage::getModel('catalog/product')
        ->getCollection()
        ->joinField('category_1', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
        ->joinField('category_2', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
        ->addAttributeToSelect('*');

$catsSaleWinner = [$saleId, $winnerId];
$catsFruitVeg = [$fruitId, $vegId];
$collection->addAttributeToFilter('category_1', array('in' => $catsSaleWinner));
$collection->addAttributeToFilter('category_2', array('in' => $catsFruitVeg));
$collection->getSelect()->group('e.entity_id');