Magento 2: Filtrar coleção de produtos por várias categorias (Magento 2.1)

10

Estou usando o Magento 2.1.0 e atualmente estou tendo dificuldades em filtrar a coleção de produtos com várias categorias. Eu usei mais de duas maneiras de fazê-lo funcionar, mas não funcionará.

Assumindo:

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

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
  2. Retorna exceção: Nome de atributo inválido: category_id

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
  3. Retorna erro de sintaxe ou violação de acesso

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

Algum conselho sobre como eu poderia ter esse trabalho ou algo relacionado a esse trabalho?

Morgy
fonte
Tente verificar o sql gerado. $ productCollection-> getSelectSql (true);
Arkadii Chyzhov 27/09/16

Respostas:

13

Você provavelmente está acostumado ao $thisparadigma "todo método retorna " do Magento 1. Este não é mais o caso (pelo menos nem sempre).

Especificamente, addCategoriesFilter()não retorna nada e é por isso que você recebe null.

Mude o código para:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));
Fabian Schmengler
fonte
3
Sugerir que não é mais o caso provavelmente é afirmado com muita força. A função 'addCategoryFilter' (singular) na mesma classe retorna $ this; portanto, adicionar o valor de retorno em 'addCategoriesFilter' provavelmente escapou da atenção de um desenvolvedor.
Patrick van Bergen
sim, isso faria sentido também
Fabian Schmengler
2

Sua primeira tentativa é definitivamente a maneira certa de fazer isso:

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

Agora, há duas coisas a garantir: $productCollectiondeve ser uma instância Magento\Catalog\Model\ResourceModel\Product\Collectionpara que isso funcione (ou de uma classe que a estenda).

E, obviamente, você precisa ter produtos na catalog_category_producttabela que correspondam a essa condição, talvez não seja esse o caso e é por isso que você recebe NULL.

Raphael na Digital Pianism
fonte
Qual é a melhor maneira de usar a coleção de produtos ou contratos de serviço? Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePsycho
@MagePsycho se você tem a opção sempre ir para os contratos de serviços;)
Raphael em Digital pianismo