Используя объект фабрики продуктов, я могу создать продукт, получить коллекцию продуктов и получить первый элемент этой коллекции.
/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();
Однако, если я попытаюсь добавить store_id в фильтр коллекции
$product = $this->productFactory
->create()
->getCollection()
->addFieldToFilter('store_id', 1)
->getFirstItem();
Я получаю следующую ошибку
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}
То же самое происходит, если я пытаюсь использовать репозиторий продуктов для фильтрации по store_id (репозитории используют коллекции изнутри).
Это ошибка? Или в Magento 2 изменились отношения между магазинами, веб-сайтами и продуктами, так что этот запрос больше не является законным? И то и другое? Ни? Что-то другое?
php
magento2
collection
Алан Сторм
источник
источник
Ответы:
Вы можете сделать это с помощью метода
addStoreFilter()
, см.Magento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()
addStoreFilter()
функция принимает идентификатор магазина илиStore
объект в качестве параметра.Например, чтобы получить все товары для текущего магазина:
Надеюсь, это поможет.
источник
На данный момент это выглядит как ошибка, потому что нет возможности применить фильтр магазина с
ProductRepository::getList()
методом, передавая идентификатор магазина в качестве фильтра SearchCriteria .В реализации getList вы можете обнаружить, что все фильтры из SearchCriteria применяются к коллекции.
В
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
есть специальная обработка категории фильтра , но не один для магазина.Итак, нужно добавить дополнительное условие,
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
которое проверяет, есть ли у нас фильтр хранилища и, если есть, - установить идентификатор хранилища для коллекции, что-то вроде:Создана внутренняя ошибка для этой проблемы, ее номер MAGETWO-45950
источник
setStore()
также не указывается, какие значения атрибутов конкретного магазина выбираются? Или это теперь сделано по-другому?Если вы используете пользовательскую модель с несколькими таблицами, добавьте table_name, например:
addFieldToFilter('**table_name.**column_name', 1)
источник
1) Класс это
\Magento\Catalog\Model\ResourceModel\Category\Collection
:2) Тогда метод
$collection->setStoreId(0);
источник