À l'aide d'un objet de fabrique de produits, je peux créer un produit, récupérer une collection de produits et récupérer le premier élément de cette collection
/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();
Cependant, si j'essaye d'ajouter un store_id au filtre de la collection
$product = $this->productFactory
->create()
->getCollection()
->addFieldToFilter('store_id', 1)
->getFirstItem();
J'obtiens l'erreur suivante
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}
La même chose se produit si j'essaie d'utiliser un référentiel de produit pour filtrer par store_id (les référentiels utilisent les collections sous le capot).
Est-ce un bug? Ou les relations entre les magasins, les sites Web et les produits ont-elles changé dans Magento 2 de sorte que ce n'est plus une requête légitime? Tous les deux? Ni? Autre chose?
php
magento2
collection
Alan Storm
la source
la source
Réponses:
Vous pouvez le faire avec la méthode
addStoreFilter()
, voirMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()
la
addStoreFilter()
fonction acceptera l'ID de magasin ou l'Store
objet comme paramètre.EG, pour obtenir tous les produits du magasin actuel :
Espérons que cela aide.
la source
Pour l'instant, cela ressemble à un bogue, car il n'y a aucune possibilité d'appliquer un filtre de magasin avec la
ProductRepository::getList()
méthode, en passant l'ID de magasin comme filtre de SearchCriteria .Dans l'implémentation getList, vous pouvez constater que tous les filtres de SearchCriteria appliqués à la collection
Il
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
y a une manipulation spéciale pour le filtre de catégorie , mais il n'y a personne pour Store.Donc, une condition supplémentaire devrait être ajoutée pour
Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection
vérifier si nous avons un filtre de magasin et si nous avons - définir l'ID de magasin pour la collecte, quelque chose comme:Bogue interne créé pour ce problème, son numéro est MAGETWO-45950
la source
setStore()
spécifie pas également les valeurs d'attribut spécifiques au magasin qui sont récupérées? Ou est-ce que cela se fait différemment maintenant?Si vous utilisez un modèle personnalisé avec plusieurs tables, ajoutez table_name comme:
addFieldToFilter('**table_name.**column_name', 1)
la source
1) La classe est
\Magento\Catalog\Model\ResourceModel\Category\Collection
:2) Ensuite, la méthode est
$collection->setStoreId(0);
la source