Magento 2:複数のカテゴリで製品コレクションをフィルタリングする(Magento 2.1)


10

Magento 2.1.0を使用していますが、現在、複数のカテゴリで製品コレクションをフィルタリングするのが困難です。私はそれを機能させるために2つ以上の方法を使用しましたが、機能しません。

仮定:

$catalog_ids = [618, 619, 620];
  1. NULLを返します

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
  2. 例外を返します:無効な属性名:category_id

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
  3. 構文エラーまたはアクセス違反を返します

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_ids', array(
            'finset' => $catalog_ids
        ));

この作品を作成したり、この作品にリンクを張ったりする方法についてアドバイスはありますか?


生成されたSQLを確認してください。$ productCollection-> getSelectSql(true);
Arkadii Chyzhov 2016

回答:


13

$thisMagento 1 の「すべてのメソッドが返す」パラダイムに慣れている可能性があります。これはもう当てはまりません(少なくとも常にではありません)。

具体的にaddCategoriesFilter()は、何も返さないため、が返されますnull

コードを次のように変更します。

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));

3
もはやそうではないことを示唆することはおそらくあまりにも強く述べられている。同じクラスの関数 'addCategoryFilter'(単数)は$ thisを返します。そのため、 'addCategoriesFilter'に戻り値を追加しても、おそらく開発者の注意を逃れてしまいます。
Patrick van Bergen

ええ、それも理にかなっています
ファビアンシュメングラー2016

2

あなたの最初の試みは間違いなくそれを行う正しい方法です:

$values = [318, 619, 620];
$conditionType = "in";
$productCollection->addCategoriesFilter([$conditionType => $values]);

これを確実にするために2つのこと$productCollectionがあります。Magento\Catalog\Model\ResourceModel\Product\Collectionこれが機能するには(またはそれを拡張するクラスから)のインスタンスでなければなりません。

そして、明らかにあなたはcatalog_category_productその条件に一致する製品をテーブルに持っている必要があります、多分それはそうではなく、それがあなたがNULLを得る理由です。


製品コレクションを使用するか、サービス契約を使用するより良い方法はどれですか?Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePsycho 2016

@MagePsycho(サービス契約を常に選択できる場合);)
デジタルピアニズムのラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.