Korzystając z obiektu fabryki produktów, mogę utworzyć produkt, pobrać kolekcję produktów i pobrać pierwszy element z tej kolekcji
/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();
Jeśli jednak spróbuję dodać identyfikator_sklepu do filtra kolekcji
$product = $this->productFactory
->create()
->getCollection()
->addFieldToFilter('store_id', 1)
->getFirstItem();
Pojawia się następujący błąd
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}
To samo dzieje się, jeśli spróbuję użyć repozytorium produktów do filtrowania według store_id (repozytoria używają kolekcji pod maską).
Czy to błąd? A może relacje między sklepami, stronami internetowymi i produktami zmieniły się w Magento 2, tak że nie jest to już uzasadnione zapytanie? Obie? Ani? Coś innego?
php
magento2
collection
Alan Storm
źródło
źródło
Odpowiedzi:
Możesz to zrobić za pomocą metody
addStoreFilter()
, patrzMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()
addStoreFilter()
funkcja będzie akceptować sklepu identyfikator lubStore
obiekt jako parametr.EG, aby uzyskać wszystkie produkty dla bieżącego sklepu:
Mam nadzieję, że to pomaga.
źródło
Na razie wygląda to na błąd, ponieważ nie ma możliwości zastosowania filtru sklepu za pomocą
ProductRepository::getList()
metody, przekazując identyfikator sklepu jako filtr SearchCriteria .W implementacji getList można stwierdzić, że wszystkie filtry z SearchCriteria zastosowano do kolekcji
W
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
nie ma specjalnego traktowania dla filtru kategorii , ale nie ma nikogo do sklepu.Tak więc należy dodać dodatkowy warunek,
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
który sprawdza, czy mamy filtr sklepu, a jeśli mamy - ustawiam identyfikator sklepu do zbierania, na przykład:Utworzono wewnętrzny błąd dla tego problemu, jego numer to MAGETWO-45950
źródło
setStore()
określa również, które konkretne atrybuty sklepu są pobierane? Czy jest to teraz robione w inny sposób?Jeśli używasz modelu niestandardowego z kilkoma tabelami, dodaj nazwę_tabeli, taką jak:
addFieldToFilter('**table_name.**column_name', 1)
źródło
1) Klasa jest
\Magento\Catalog\Model\ResourceModel\Category\Collection
:2) Zatem metoda jest
$collection->setStoreId(0);
źródło