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?


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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.