Magento 2: Filtruj kolekcję produktów według wielu kategorii (Magento 2.1)

10

Używam Magento 2.1.0 i mam obecnie trudności z filtrowaniem kolekcji produktów z wieloma kategoriami. Użyłem więcej niż kilku sposobów, aby to zadziałało, ale nie zadziała.

Zarozumiały:

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

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
    
  2. Zwraca wyjątek: niepoprawna nazwa atrybutu: id_kategorii

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
    
  3. Zwraca błąd składniowy lub naruszenie dostępu

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

Wszelkie porady na temat tego, w jaki sposób mogę mieć tę pracę lub coś powiązać z tą pracą?

Morgy
źródło
Spróbuj sprawdzić wygenerowany sql. $ productCollection-> getSelectSql (true);
Arkadii Chyzhov

Odpowiedzi:

14

Prawdopodobnie przyzwyczaiłeś się do $thisparadygmatu „każda metoda zwraca ” z Magento 1. Już tak nie jest (przynajmniej nie zawsze).

W szczególności addCategoriesFilter()nic nie zwraca i dlatego otrzymujesz null.

Zmień kod na:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));
Fabian Schmengler
źródło
3
Sugerowanie, że już tak nie jest, jest prawdopodobnie stwierdzone zbyt mocno. Funkcja „addCategoryFilter” (liczba pojedyncza) w tej samej klasie zwraca $ this; więc dodanie wartości zwracanej w „addCategoriesFilter” prawdopodobnie właśnie umknęło uwadze programisty.
Patrick van Bergen,
tak, to też miałoby sens
Fabian Schmengler
2

Twoja pierwsza próba jest zdecydowanie właściwym sposobem:

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

Teraz należy zapewnić dwie rzeczy: $productCollectionmusi to być instancja, Magento\Catalog\Model\ResourceModel\Product\Collectionaby to zadziałało (lub z klasy, która ją rozszerza).

I oczywiście musisz mieć produkty w catalog_category_producttabeli, które pasują do tego warunku, może tak nie jest i dlatego otrzymujesz NULL.

Raphael at Digital Pianism
źródło
Jaki jest lepszy sposób korzystania ze zbiórki produktów lub umów serwisowych? Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePsycho 27.09.16
@MagePsycho, jeśli masz wybór, zawsze wybieraj kontrakty serwisowe;)
Raphael w Digital Pianism