Magento 2: Produktkollektion nach mehreren Kategorien filtern (Magento 2.1)


9

Ich verwende Magento 2.1.0 und habe derzeit Probleme beim Filtern der Produktsammlung nach mehreren Kategorien. Ich habe mehr als ein paar Möglichkeiten verwendet, damit es funktioniert, aber es wird nicht.

Angenommen:

$catalog_ids = [618, 619, 620];
  1. Gibt NULL zurück

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
  2. Gibt eine Ausnahme zurück: Ungültiger Attributname: category_id

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
  3. Gibt einen Syntaxfehler oder eine Zugriffsverletzung zurück

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

Irgendwelche Ratschläge, wie ich diese Arbeit haben oder etwas mit dieser Arbeit verknüpfen könnte?


Versuchen Sie, die generierte SQL zu überprüfen. $ productCollection-> getSelectSql (true);
Arkadii Chyzhov

Antworten:


12

Sie sind wahrscheinlich an das $thisParadigma "Jede Methode gibt zurück " aus Magento 1 gewöhnt. Dies ist nicht mehr der Fall (zumindest nicht immer).

Insbesondere addCategoriesFilter()gibt nichts zurück und deshalb erhalten Sie null.

Ändern Sie den Code in:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));

3
Zu behaupten, dass dies nicht mehr der Fall ist, wird wahrscheinlich zu stark angegeben. Die Funktion 'addCategoryFilter' (Singular) in derselben Klasse gibt $ this zurück. Das Hinzufügen des Rückgabewerts in 'addCategoriesFilter' ist daher wahrscheinlich gerade der Aufmerksamkeit eines Entwicklers entgangen.
Patrick van Bergen

Ja, das würde auch Sinn machen
Fabian Schmengler

2

Ihr erster Versuch ist definitiv der richtige Weg:

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

Jetzt müssen zwei Dinge sichergestellt werden: Es $productCollectionmuss eine Instanz sein, Magento\Catalog\Model\ResourceModel\Product\Collectiondamit dies funktioniert (oder von einer Klasse, die es erweitert).

Und natürlich müssen Sie Produkte in der catalog_category_productTabelle haben, die dieser Bedingung entsprechen. Vielleicht ist das nicht der Fall und deshalb erhalten Sie NULL.


Was ist der bessere Weg, um Produktkollektionen oder Serviceverträge zu nutzen? Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePsycho

@MagePsycho, wenn Sie die Wahl haben, gehen Sie immer für Serviceverträge;)
Raphael bei Digital Pianism
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.