Magento 2:如何通过商店ID筛选产品集合


11

使用产品工厂对象,我可以创建产品,获取产品集合并获取该集合的第一项

/* 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中更改了商店,网站和产品之间的关系,以使其不再是合法查询?都?都不行 还有吗


我是M2的新手,但您不能使用github.com/magento/magento2/blob/develop/app/code/Magento/…吗?
fmrng

@fnng使用方法知道,但是我想说“请给我提供X商店中所有产品的清单”。不知道setStoreId将如何执行此操作。
艾伦·风暴

Answers:


4

您可以使用方法执行此操作addStoreFilter(),请参见Magento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

addStoreFilter()函数将接受商店ID或Store对象作为参数。

EG,以获取当前商店的所有产品:

public function getProducts(){
    return $this->collection->addStoreFilter($this->_storeManager->getStore()); 
}

希望这会有所帮助。


谢谢@amitbeta!如果您有时间-您是否知道是否可以使用产品存储库创建商店过滤器? magento.stackexchange.com/questions/91278/…–
艾伦·斯托姆

当然..我会看
阿米特·贝拉

@AmitBera,请您解释一下如何在产品集合中使用addStoreFilter()。

5

现在,这看起来像是个bug,因为无法通过该ProductRepository::getList()方法应用商店过滤器,而将商店ID传递为SearchCriteria的过滤器。

在getList实现中,您可以发现SearchCriteria中的所有过滤器都应用于集合

    foreach ($searchCriteria->getFilterGroups() as $group) {
        $this->addFilterGroupToCollection($group, $collection);
    }

Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection其中,对类别过滤器进行了特殊处理,但对于商店没有任何处理。

因此,应该添加其他条件来Magento\Catalog\Model\ProductRepository::addFilterGroupToCollection检查我们是否具有商店过滤器,以及是否有-设置要收集的商店ID,例如:

        if ($filter->getField() == \Magento\Catalog\Model\Product::STORE_ID) {
            $collection->setStore($filter->getValue());
            continue;
        }

已为此问题创建内部错误,其编号为MAGETWO-45950


有什么消息吗?我在Github上找不到票号的参考。
Fabian Schmengler,

1
在Magento 2中,产品分配给网站,而不是商店。因此,Alan描述的初始行为是正确的,因为“产品”实体没有“商店ID”链接,而只是链接到“网站ID”。内部票证是关于将带有ProductWebsiteLinkInterface的Extension属性引入ProductInterface
Igor Minyaylo

除了商店/网站关联之外,是否还不setStore()指定要获取哪个商店的特定属性值?还是现在以不同的方式完成?
Fabian Schmengler '16

产品模型实现中有setStoreId / getStoreId方法,但ProductInterface中没有,因此建议您在业务逻辑中不要依赖它们。
Igor Minyaylo

现在,解析由REST API中的StoreID URL部分产生的StoreView级别值(例如,属性的本地化)
Igor Minyaylo

0

如果您将自定义模型与多个表一起使用,请添加table_name,例如: addFieldToFilter('**table_name.**column_name', 1)


正如您在上面所说的,您能否分享从我的专栏中加载实体集合所用的整个代码段,例如实体ID
Sushivam,2016年

0

1)该类是\Magento\Catalog\Model\ResourceModel\Category\Collection

/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
$collection = $this->categoryFactory->create()->getCollection()
        ->addFieldToSelect('*');

2)然后的方法是 $collection->setStoreId(0);


PS,而不是0,您可以将商店ID
设为

Meta:出于某种原因,星号已从此处的消息中删除。
Giedrius Tumelis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.