Magento 2:按多个类别过滤产品集合(Magento 2.1)


10

我正在使用Magento 2.1.0,目前在过滤具有多个类别的产品集合时遇到困难。我已经使用了多种方法来使其工作,但是没有成功。

假设:

$catalog_ids = [618, 619, 620];
  1. 返回NULL

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
  2. 返回异常:无效的属性名称:category_id

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
  3. 返回语法错误或访问冲突

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_ids', array(
            'finset' => $catalog_ids
        ));

关于如何进行这项工作或将某些内容链接到这项工作的任何建议?


尝试检查生成的sql。$ productCollection-> getSelectSql(true);
Arkadii Chyzhov 2016年

Answers:


13

您可能已经习惯了$thisMagento 1 的“每种方法都会返回”范例。现在不再是这种情况了(至少不是总是如此)。

具体来说,addCategoriesFilter()不返回任何东西,这就是为什么要得到null

将代码更改为:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));

3
暗示现在已不再是事实了,那就太过强烈了。同一类中的函数“ addCategoryFilter”(单数)确实返回$ this;。因此在'addCategoriesFilter'中添加返回值可能只是逃避了开发人员的注意。
Patrick van Bergen

是啊,这将使意义太
法比安Schmengler

2

您的第一次尝试绝对是正确的方法:

$values = [318, 619, 620];
$conditionType = "in";
$productCollection->addCategoriesFilter([$conditionType => $values]);

现在要确保两件事:$productCollection必须有一个实例Magento\Catalog\Model\ResourceModel\Product\Collection才能使其正常工作(或来自扩展它的类)。

显然,您需要在catalog_category_product表中具有与该条件匹配的产品,也许并非如此,这就是为什么您得到NULL的原因。


使用产品收集或使用服务合同的哪种更好的方法是?Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePsycho

@MagePsycho,如果您可以选择的话,请务必签订服务合同;)
拉斐尔(Raphael)在Digital Pianism
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.