1

私は、製品コレクションを 2 つ以上のカテゴリでフィルタリングする方法について、クリーンな解決策を得るために何日も努力してきました。商品は、いずれかのカテゴリではなく、カテゴリ A とカテゴリ B の両方に含まれている必要があります。インターネットで見つけた複数の解決策を試しましたが、成功しませんでした。これまでに見つけた唯一の回避策 (しかし、私はそれを見つけていません) は、生のクエリを使用して、ID からコレクションを取得することです。

SELECT e.entity_id FROM catalog_product_entity AS e INNER JOIN catalog_category_product AS ccp on ccp.product_id=e.entity_id where ccp.category_id =100 or ccp.category_id = 101 group by entity_id having count(*) > 1

これにより、カテゴリ 100 と 101 の両方で見つかった製品のリストが返されます。ただし、実際には「Magento の方法」または生のクエリを実行することなくこれを行う方法があることを願っています。誰でもこれについて手がかりがありますか?

ありがとう

4

2 に答える 2

4

長い夜の仕事の後、ようやく適切な解決策を見つけることができました:

$cat_ids = array(4,5,6);
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
    ->addAttributeToFilter('category_id', array('in' => array('finset' => $cat_ids)))
    ->getSelect()
    ->group('entity_id')
    ->having('count(*) = ' . count($cat_ids));

ほらね。上記は、指定されたすべてのカテゴリに同時に含まれるすべての製品を返します。助けてくれたactiveDevとJurgenに感謝します。

于 2012-08-25T08:00:05.547 に答える
0

これはうまくいくはずです。

$collection = Mage::getModel('catalog/product')
            ->getCollection()
            ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
            ->addAttributeToFilter('category_id', array('in' => array('finset' => '36,37')))
            ->addAttributeToSelect('*')
            ->setPageSize(5);

これはhttp://blog.chapagain.com.np/magento-how-to-filter-product-collection-using-2-or-more-category-filters/からのものですが、少し古くなっているようです。

現在カテゴリを含まないバージョンで作業しているため、これが機能するかどうかを確認できません。しかし、期待どおりに空のコレクションを取得しているので、お知らせください!

于 2012-08-24T11:49:19.427 に答える