Magento 2: come filtrare una collezione di prodotti per ID negozio


11

Usando un oggetto factory di prodotto, sono in grado di creare un prodotto, prendere una raccolta di prodotti e recuperare il primo elemento di quella raccolta

/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();

Tuttavia, se provo ad aggiungere un store_id al filtro della raccolta

    $product = $this->productFactory
        ->create()
        ->getCollection()
        ->addFieldToFilter('store_id', 1)
        ->getFirstItem();

Ottengo il seguente errore

Invalid attribute name: store_id
#0 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(1434): Magento\Eav\Model\Entity\Collection\AbstractCollection->_addAttributeJoin('store_id', 'inner')
#1 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(359): Magento\Eav\Model\Entity\Collection\AbstractCollection->_getAttributeConditionSql('store_id', 1, 'inner')
#2 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Catalog/Model/Resource/Product/Collection.php(1489): Magento\Eav\Model\Entity\Collection\AbstractCollection->addAttributeToFilter('store_id', 1, 'inner')
#3 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(382): Magento\Catalog\Model\Resource\Product\Collection->addAttributeToFilter('store_id', 1)
...
#63 {main}

La stessa cosa accade se provo a utilizzare un repository di prodotti per filtrare per store_id (i repository utilizzano le raccolte sotto il cofano).

è un insetto? O le relazioni tra negozi, siti Web e prodotti sono cambiate in Magento 2 in modo tale che questa non sia più una domanda legittima? Entrambi? Nessuno dei due? Qualcos'altro?


Sono molto nuovo su M2, ma non puoi usare questo github.com/magento/magento2/blob/develop/app/code/Magento/… ?
fmrng,

@fnng Usa il metodo per sapere, ma voglio dire "per favore fammi un elenco di tutti i prodotti che fanno parte del negozio X". Non sono sicuro di come setStoreId lo farebbe.
Alan Storm,

Risposte:


4

Puoi farlo con il metodo addStoreFilter(), vediMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

la addStoreFilter()funzione accetterà l'ID negozio o l' Storeoggetto come parametro.

Ad esempio, per ottenere tutti i prodotti per il negozio attuale :

public function getProducts(){
    return $this->collection->addStoreFilter($this->_storeManager->getStore()); 
}

Speriamo che questo aiuti.


Grazie @amitbeta! Se hai un momento, sai se è possibile creare un filtro negozio usando i repository di prodotti? magento.stackexchange.com/questions/91278/…
Alan Storm

certo ... guarderò
Amit Bera

@AmitBera, per favore, puoi spiegare un po 'come utilizzare addStoreFilter () per la raccolta dei prodotti.

5

Per ora questo sembra un bug, perché non è possibile applicare il filtro negozio con il ProductRepository::getList()metodo, passando l'ID negozio come filtro di SearchCriteria .

Nell'implementazione di getList, è possibile trovare tutti i filtri di SearchCriteria applicati alla raccolta

    foreach ($searchCriteria->getFilterGroups() as $group) {
        $this->addFilterGroupToCollection($group, $collection);
    }

In Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionc'è una gestione speciale per filtro Categoria , ma non c'è nessuno per la conservazione.

Quindi, è necessario aggiungere una condizione aggiuntiva alla Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionquale verificare se abbiamo il filtro negozio e se abbiamo - impostare l'ID negozio per la raccolta, qualcosa del tipo:

        if ($filter->getField() == \Magento\Catalog\Model\Product::STORE_ID) {
            $collection->setStore($filter->getValue());
            continue;
        }

Bug interno creato per questo problema, il suo numero è MAGETWO-45950


Qualche novità su questo? Non riesco a trovare un riferimento al numero del biglietto su Github.
Fabian Schmengler,

1
In Magento 2 i prodotti vengono assegnati ai siti Web, non ai negozi. Pertanto, il comportamento iniziale descritto da Alan è corretto, poiché l'entità Prodotto non ha un collegamento ID negozio, ma solo un collegamento all'ID sito Web. E il ticket interno riguarda l'introduzione dell'attributo Extension con ProductWebsiteLinkInterface in ProductInterface
Igor Minyaylo,

Oltre all'associazione negozio / sito Web, non setStore()specifica anche quali valori di attributi specifici del negozio vengono recuperati? O questo è fatto in un modo diverso ora?
Fabian Schmengler,

Esistono metodi setStoreId / getStoreId nell'implementazione del modello del prodotto, ma non ce ne sono in ProductInterface, quindi non è consigliabile fare affidamento su di essi nella logica aziendale.
Igor Minyaylo,

Per la risoluzione dei valori a livello di StoreView (ad esempio, la localizzazione degli attributi) effettuata dalla parte URL StoreID nelle API REST
Igor Minyaylo,

0

Se usi un modello personalizzato con più tabelle aggiungi table_name come: addFieldToFilter('**table_name.**column_name', 1)


Potresti condividere l'intero frammento per il caricamento della raccolta di prodotti dalla mia colonna, dire ID entità, come hai detto sopra
Sushivam,

0

1) La classe è \Magento\Catalog\Model\ResourceModel\Category\Collection:

/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
$collection = $this->categoryFactory->create()->getCollection()
        ->addFieldToSelect('*');

2) Quindi il metodo è $collection->setStoreId(0);


PS invece di 0 puoi inserire il tuo ID negozio 1, 2, ...
Giedrius Tumelis

Meta: Per qualche ragione il simbolo della stella è stato rimosso dal mio messaggio qui.
Giedrius Tumelis,
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.