Magento 2: Filtrer la collection de produits par plusieurs catégories (Magento 2.1)

10

J'utilise Magento 2.1.0 et j'ai actuellement des difficultés à filtrer la collection de produits avec plusieurs catégories. J'ai utilisé plusieurs méthodes pour le faire fonctionner, mais ce ne sera pas le cas.

En supposant:

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

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
    
  2. Renvoie une exception: nom d'attribut non valide: id_catégorie

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
    
  3. Renvoie une erreur de syntaxe ou une violation d'accès

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

Des conseils sur la façon dont je pourrais avoir ce travail ou avoir un lien entre ce travail?

Morgy
la source
Essayez de vérifier le sql généré. $ productCollection-> getSelectSql (true);
Arkadii Chyzhov du

Réponses:

13

Vous êtes probablement habitué au $thisparadigme "toutes les méthodes retournent " de Magento 1. Ce n'est plus le cas (du moins pas toujours).

Plus précisément, addCategoriesFilter()ne renvoie rien et c'est pourquoi vous obtenez null.

Changez le code en:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));
Fabian Schmengler
la source
3
Dire que ce n'est plus le cas est probablement énoncé trop fortement. La fonction 'addCategoryFilter' (singulier) dans la même classe renvoie $ this; donc l'ajout de la valeur de retour dans 'addCategoriesFilter' a probablement échappé à l'attention d'un développeur.
Patrick van Bergen
ouais, ça aurait du sens aussi
Fabian Schmengler
2

Votre premier essai est certainement la bonne façon de le faire:

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

Maintenant, il y a deux choses à garantir: $productCollectiondoit être une instance de Magento\Catalog\Model\ResourceModel\Product\Collectionpour que cela fonctionne (ou d'une classe qui l'étend).

Et évidemment, vous devez avoir dans le catalog_category_producttableau des produits qui correspondent à cette condition, ce n'est peut-être pas le cas et c'est pourquoi vous obtenez NULL.

Raphael chez Digital Pianism
la source
Quelle est la meilleure façon d'utiliser la collecte de produits ou les contrats de service? Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePsycho
@MagePsycho si vous avez le choix, toujours opter pour des contrats de service;)
Raphael au Digital Pianism