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.