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ą?


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.