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でストア、Webサイト、および製品間の関係が変更され、これが正当なクエリではなくなったのですか?どちらも?どちらでもない?他に何か?


私はM2を初めて使用しますが、このgithub.com/magento/magento2/blob/develop/app/code/Magento/…を使用できませんか?
fmrng 2015年

@fnngメソッドを使用して知っていますが、「ストアXの一部であるすべての製品のリストを入手してください」と言いたいです。setStoreIdがそれをどのように行うかはわかりません。
アランストーム

回答:


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

今のところ、これはバグのように見えます。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て、ストアフィルターがあるかどうかをチェックする必要があります。

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

この問題の内部バグを作成しました。その番号はMAGETWO-45950です。


何かニュースはありますか?Githubでチケット番号への参照が見つかりません。
Fabian Schmengler 2016年

1
Magento 2では、製品はストアではなくWebサイトに割り当てられます。したがって、製品エンティティにはストアIDリンクがなく、ウェブサイトIDにリンクするだけなので、Alanによって記述された初期動作は正しいです。内部チケットはProductWebsiteLinkInterfaceを使用したExtension属性のProductInterfaceへの導入に関するものです
Igor Minyaylo

ストアとWebサイトの関連付けに加えて、setStore()フェッチするストア固有の属性値も指定しませんか?それとも今は別の方法で行われていますか?
Fabian Schmengler、2016年

Productモデルの実装にはsetStoreId / getStoreIdメソッドがありますが、ProductInterfaceにはありません。そのため、ビジネスロジックでこれらのメソッドに依存することはお勧めしません。
Igor Minyaylo 2016年

現時点では、REST APIのStoreID URLパーツによって作成されたStoreViewレベルの値(属性のローカリゼーションなど)の解決
Igor Minyaylo

0

複数のテーブルでカスタムモデルを使用する場合は、次のようにtable_nameを追加します。 addFieldToFilter('**table_name.**column_name', 1)


あなたは、上記述べたように、あなたは、私のコラムと言うエンティティIDから製品のコレクションをロードするための全体のスニペットを共有してもらえ
Sushivam

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を1、2、...とすることができます
Giedrius Tumelis

メタ:どういうわけか、ここのメッセージから星印が削除されました。
Giedrius Tumelis 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.