Usando um objeto de fábrica do produto, sou capaz de criar um produto, pegar uma coleção de produtos e buscar o primeiro item dessa coleção
/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();
No entanto, se eu tentar adicionar um store_id ao filtro da coleção
$product = $this->productFactory
->create()
->getCollection()
->addFieldToFilter('store_id', 1)
->getFirstItem();
Eu obtenho o seguinte erro
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}
O mesmo acontece se eu tentar usar um repositório de produtos para filtrar por store_id (os repositórios usam as coleções sob o capô).
Isso é um inseto? Ou os relacionamentos entre lojas, sites e produtos foram alterados no Magento 2, de modo que essa não seja mais uma consulta legítima? Ambos? Nem? Algo mais?
php
magento2
collection
Alan Storm
fonte
fonte
Respostas:
Você pode fazer isso com o método
addStoreFilter()
, consulteMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()
a
addStoreFilter()
função aceitará o ID ouStore
objeto da loja como parâmetro.Por exemplo, para obter todos os produtos da loja atual :
Felizmente, isso ajuda.
fonte
Por enquanto, isso parece um bug, porque não há possibilidade de aplicar filtro de loja com o
ProductRepository::getList()
método, passando o ID da loja como um filtro de SearchCriteria .Na implementação getList, você pode encontrar todos os filtros de SearchCriteria aplicados à coleção
Em
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
há tratamento especial para Categoria filtro , mas não há ninguém para Store.Portanto, deve ser adicionada uma condição adicional para
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
verificar se temos filtro de loja e se definimos o ID da loja para coleta, algo como:Criado bug interno para esse problema, seu número é MAGETWO-45950
fonte
setStore()
também não especifica quais valores de atributo específicos da loja são buscados? Ou isso é feito de uma maneira diferente agora?Se você usar o modelo personalizado com várias tabelas, adicione table_name como:
addFieldToFilter('**table_name.**column_name', 1)
fonte
1) A turma é
\Magento\Catalog\Model\ResourceModel\Category\Collection
:2) Então o método é
$collection->setStoreId(0);
fonte