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
        ));

Любой совет о том, как я мог бы иметь эту работу или что-то связать эту работу?

Morgy
источник
Попробуйте проверить сгенерированный sql. $ productCollection-> getSelectSql (истина);
Аркадий Чижов

Ответы:

13

Вероятно, вы привыкли к $thisпарадигме «каждый метод возвращает » из Magento 1. Это уже не так (по крайней мере, не всегда).

Конкретно addCategoriesFilter()ничего не возвращает и вот почему вы получаете null.

Измените код на:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));
Фабиан Шменглер
источник
3
Предположить, что это не так, вероятно, заявлено слишком решительно. Функция addCategoryFilter (в единственном числе) в том же классе возвращает $ this; поэтому добавление возвращаемого значения в addCategoriesFilter, вероятно, просто ускользнуло от внимания разработчика.
Патрик ван Берген
да, это тоже имело бы смысл
Фабиан Шменглер
2

Ваша первая попытка, безусловно, правильный способ сделать это:

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

Теперь нужно убедиться в двух вещах: $productCollectionдолжен быть экземпляр Magento\Catalog\Model\ResourceModel\Product\Collectionдля этого (или из класса, который его расширяет).

И, очевидно, вам нужно иметь продукты в catalog_category_productтаблице, которые соответствуют этому условию, возможно, это не тот случай, и поэтому вы получаете NULL.

Рафаэль в цифровом пианизме
источник
Какой способ лучше использовать для сбора продуктов или заключения контрактов на обслуживание? Magento \ Каталог \ Api \ Данные \ ProductSearchResultsInterface
MagePsycho
@MagePsycho, если у вас есть выбор, всегда обращайтесь за сервисными контрактами;)
Рафаэль на Digital Pianism,