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);
Аркадій Чижов

Відповіді:


14

Ви, мабуть, звикли до $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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.