Magento 2: Filtern einer Produktsammlung nach Geschäfts-ID


11

Mithilfe eines Product Factory-Objekts kann ich ein Produkt erstellen, eine Produktsammlung abrufen und das erste Element dieser Sammlung abrufen

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

Wenn ich jedoch versuche, dem Filter der Sammlung eine store_id hinzuzufügen

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

Ich erhalte den folgenden Fehler

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}

Das gleiche passiert, wenn ich versuche, ein Produkt-Repository zum Filtern nach store_id zu verwenden (die Repositorys verwenden die Sammlungen unter der Haube).

Ist das ein Fehler? Oder haben sich die Beziehungen zwischen Geschäften, Websites und Produkten in Magento 2 so geändert, dass dies keine legitime Abfrage mehr ist? Beide? Weder? Etwas anderes?


Ich bin sehr neu in M2, aber können Sie diesen nicht verwenden ? Github.com/magento/magento2/blob/develop/app/code/Magento/… ?
Uhr

@fnng Verwenden Sie die Methode, um zu wissen, aber ich möchte sagen "Bitte besorgen Sie mir eine Liste aller Produkte, die Teil von Store X sind". Ich bin mir nicht sicher, wie setStoreId das tun würde.
Alan Storm

Antworten:


4

Sie können dies mit der Methode tun addStoreFilter(), sieheMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

Die addStoreFilter()Funktion akzeptiert die Speicher-ID oder das StoreObjekt als Parameter.

EG, um alle Produkte für das aktuelle Geschäft zu erhalten:

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

Hoffentlich hilft das.


Danke @amitbeta! Wenn Sie einen Moment Zeit haben - wissen Sie, ob es möglich ist, mithilfe von Produktrepositorys einen Filialfilter zu erstellen? magento.stackexchange.com/questions/91278/…
Alan Storm

sicher .. ich werde schauen
Amit Bera

@AmitBera, Bitte erklären Sie uns ein wenig, wie Sie addStoreFilter () zur Produktkollektion verwenden.

5

Im Moment sieht dies wie ein Fehler aus, da es keine Möglichkeit gibt, einen Speicherfilter mit der ProductRepository::getList()Methode anzuwenden und die Speicher-ID als Filter für SearchCriteria zu übergeben .

In der getList-Implementierung finden Sie, dass alle Filter von SearchCriteria auf die Sammlung angewendet wurden

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

Es Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectiongibt eine spezielle Behandlung für Kategoriefilter , aber es gibt niemanden für Store.

Daher sollte eine zusätzliche Bedingung hinzugefügt werden, Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectiondie prüft, ob wir einen Speicherfilter haben und ob wir - die Speicher-ID für die Sammlung festgelegt haben, etwa:

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

Interner Fehler für dieses Problem erstellt, seine Nummer ist MAGETWO-45950


Irgendwelche Neuigkeiten dazu? Ich kann auf Github keinen Verweis auf die Ticketnummer finden.
Fabian Schmengler

1
In Magento 2 werden Produkte Websites zugewiesen, nicht Geschäften. Das von Alan beschriebene anfängliche Verhalten ist also korrekt, da die Produktentität keinen Link zur Store-ID hat, sondern nur einen Link zur Website-ID. Und das interne Ticket handelt von der Einführung des Erweiterungsattributs mit ProductWebsiteLinkInterface in das ProductInterface
Igor Minyaylo

Gibt neben der Zuordnung von Geschäft zu Website nicht setStore()auch an, welche speicherspezifischen Attributwerte abgerufen werden? Oder wird das jetzt anders gemacht?
Fabian Schmengler

In der Implementierung des Produktmodells gibt es setStoreId / getStoreId-Methoden, in ProductInterface jedoch keine. Daher wird nicht empfohlen, sich in Ihrer Geschäftslogik auf diese zu verlassen.
Igor Minyaylo

Derzeit wird nach StoreView-Level-Werten (z. B. Lokalisierung von Attributen) aufgelöst, die vom StoreID-URL-Teil in REST-APIs erstellt wurden
Igor Minyaylo,

0

Wenn Sie ein benutzerdefiniertes Modell mit mehreren Tabellen verwenden, fügen Sie tabellennamen wie folgt hinzu: addFieldToFilter('**table_name.**column_name', 1)


Könnten Sie bitte das gesamte Snippet zum Laden der Produktkollektion aus meiner Spalte teilen, sagen Sie Entity ID, wie Sie oben gesagt haben
Sushivam

0

1) Die Klasse ist \Magento\Catalog\Model\ResourceModel\Category\Collection:

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

2) Dann ist die Methode $collection->setStoreId(0);


PS statt 0 können Sie Ihre Shop-ID 1, 2, ...
Giedrius Tumelis

Meta: Aus irgendeinem Grund wurde das Sternsymbol hier aus meiner Nachricht entfernt.
Giedrius Tumelis
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.