Utilizando un objeto de fábrica de productos, puedo crear un producto, tomar una colección de productos y obtener el primer elemento de esa colección
/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();
Sin embargo, si intento agregar un store_id al filtro de la colección
$product = $this->productFactory
->create()
->getCollection()
->addFieldToFilter('store_id', 1)
->getFirstItem();
Obtuve el siguiente error
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}
Lo mismo sucede si intento usar un repositorio de productos para filtrar por store_id (los repositorios usan las colecciones bajo el capó).
¿Es esto un error? ¿O las relaciones entre tiendas, sitios web y productos han cambiado en Magento 2 de modo que ya no se trata de una consulta legítima? ¿Ambos? ¿Ninguno? ¿Algo más?
php
magento2
collection
Alan Storm
fuente
fuente
Respuestas:
Puede hacer esto con el método
addStoreFilter()
, veaMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()
la
addStoreFilter()
función aceptará la identificación de la tienda o elStore
objeto como parámetro.Por ejemplo, para obtener todos los productos para la tienda actual :
Con suerte, esto ayuda.
fuente
Por ahora esto parece un error, porque no hay posibilidad de aplicar el filtro de la tienda con el
ProductRepository::getList()
método, pasando la identificación de la tienda como un filtro de SearchCriteria .En la implementación de getList, puede encontrar que todos los filtros de SearchCriteria se aplicaron a la colección
En
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
existe un manejo especial para el filtro Categoría , pero no hay nadie para tienda.Por lo tanto, se debe agregar una condición adicional a la
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
que verifica si tenemos filtro de tienda y si tenemos - establecemos el ID de la tienda para la colección, algo como:Error interno creado para este problema, su número es MAGETWO-45950
fuente
setStore()
especifica qué valores de atributo específicos de la tienda se obtienen? ¿O se hace esto de una manera diferente ahora?Si usa un modelo personalizado con varias tablas, agregue table_name como:
addFieldToFilter('**table_name.**column_name', 1)
fuente
1) La clase es
\Magento\Catalog\Model\ResourceModel\Category\Collection
:2) Entonces el método es
$collection->setStoreId(0);
fuente