2

参考 Magento 1.7 按多个类别过滤产品 我有一个新问题:

我正在使用 Magento 1.7.0.2,并且所描述的按多个类别(通过 AND)过滤产品集合的解决方案对我不起作用。

我的分类结构:

    • 猫 1
      • 猫 1a
      • 猫 1b
    • 猫 2
      • 猫 2a
      • 猫 2b
    • 猫 3

例如,产品可以同时在 cat 1a、cat 2 和 cat 2b 中。如果我过滤,它应该被列出:

  • 在猫 1a 之后
  • 在猫 1a 和猫 2 之后
  • 在猫 1a 和 2b 和 2 之后

如果我过滤,它一定可见:

  • 在猫 3 之后
  • 在猫 1 和猫 1a 之后
  • 在猫 1a 和 2a 之后

我的代码:

$_productCollection = Mage::getModel('catalog/product')
        ->getCollection()
        ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id',
            array("finset" => array(53, 46))
        );

这给了我一个 SQL 错误:

#1582 - Incorrect parameter count in the call to native function 'FIND_IN_SET'
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 (FIND_IN_SET(53, 46, at_category_id.category_id))

我要做什么才能完成这项工作?

4

2 回答 2

0

几天后,我想出了实现目标的方法。神奇的词:自定义 SQL 查询。

这是一个 SQL 语句 (MySQL) 示例,用于一次按多个类别过滤所有 product_id。

SELECT a.product_id as entity_id
    FROM catalog_category_product a
    WHERE EXISTS (SELECT b.product_id
                  FROM catalog_category_product b
                  WHERE b.product_id = a.product_id and b.category_id = 53)
      AND EXISTS (SELECT b.product_id
                  FROM catalog_category_product b
                  WHERE b.product_id = a.product_id and b.category_id = 46)
      AND EXISTS (SELECT b.product_id
                  FROM catalog_category_product b
                  WHERE b.product_id = a.product_id and b.category_id = 39)
    GROUP BY a.product_id

如果您愿意,您可以重复“并且存在......”直到世界末日;)这将过滤所有产品,同时在类别 53、46 和 39 中。

您可以在此处阅读有关 Magento 中自定义 SQL 命令的更多信息:http: //magentotutorials.blogspot.de/2011/07/magento-code-to-run-custom-sql-query.html

于 2012-11-13T14:49:34.317 回答
0

您在通话中缺少一个数组:

->addAttributeToFilter('category_id', array(
     array('finset' => array(53, 46)),
 )
于 2012-11-08T09:24:24.033 回答