Magento 2: Filtro raccolta prodotti per più categorie (Magento 2.1)


10

Sto usando Magento 2.1.0 e attualmente sto riscontrando difficoltà nel filtrare la raccolta di prodotti con più categorie. Ho usato più di un paio di modi per farlo funzionare, ma non lo farà.

assumendo:

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

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
    
  2. Restituisce eccezione: Nome attributo non valido: category_id

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
    
  3. Restituisce errore di sintassi o violazione di accesso

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

Qualche consiglio su come potrei avere questo lavoro o avere qualcosa che colleghi questo lavoro?


Prova a controllare sql generato. $ productCollection-> getSelectSql (true);
Arkadii Chyzhov,

Risposte:


13

Probabilmente sei abituato al $thisparadigma "ogni metodo restituisce " di Magento 1. Questo non è più il caso (almeno non sempre).

In particolare, addCategoriesFilter()non restituisce nulla ed è per questo che si ottiene null.

Cambia il codice in:

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

3
Suggerire che non è più il caso è probabilmente affermato troppo fortemente. La funzione 'addCategoryFilter' (singolare) nella stessa classe restituisce $ this; pertanto l'aggiunta del valore restituito in "addCategoriesFilter" è probabilmente sfuggita all'attenzione di uno sviluppatore.
Patrick van Bergen,

sì, anche questo avrebbe senso
Fabian Schmengler il

2

Il tuo primo tentativo è sicuramente il modo giusto di farlo:

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

Ora ci sono due cose da garantire: $productCollectiondeve essere un'istanza di Magento\Catalog\Model\ResourceModel\Product\Collectionper farlo funzionare (o da una classe che lo estende).

E ovviamente devi avere prodotti nella catalog_category_producttabella che soddisfino quella condizione, forse non è così ed è per questo che ottieni NULL.


Qual è il modo migliore di utilizzare la raccolta di prodotti o utilizzare i contratti di assistenza? Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePsycho

@MagePsycho se hai sempre la possibilità di scegliere contratti di servizio;)
Raffaello al Pianismo digitale,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.