我试图按类别和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的第一个问题,所以请原谅我礼仪上的任何错误。
答案 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');