1

I'm attempting to filter a product collection by two different category_ids. The solution i've come up involves generating two seperate product collections each filtered from the original by one category_id then merging them together. How does one merge product collections in this way? Let's take a look:

function categoryProductFilter($collection, $categoryIds){
        $collection->joinField('category_id',
            'catalog/category_product',
            'category_id',
            'product_id=entity_id',
            null,
            'left'
        );
        $categoryCollectionTwo = $collection->addAttributeToFilter(array(array('attribute' => 'category_id', 'finset' => 773)));
        $categoryCollectionOne = $collection->addAttributeToFilter(array(array('attribute' => 'category_id','finset' => 1550)));
        $collection=merge($categoryCollectionOne,$categoryCollectionTwo);
}
function merg($one,$two){??}

Is there an easier way to filter a product collection by two categories simultaneously? I've only managed to achieve mono-category filtering.

For reference:

$collection->addCategoryFilter(Mage::getModel('catalog/category')->load($categoryId), true);

Appears to filter the collection correctly as well as using some of the above methodology. It's almost absurd that the above cannot be used twice on the same collection to achieve appropriate filtering.

  • This has been done before: magento.stackexchange.com/a/7098/12662 – Henry's Cat Feb 27 '15 at 15:19
  • @Woolfie and yet it is still unanswered "This code doesn't work when there are two or more categories to filter and any product is assigned to multiple of these categories. Returns error as Item (Mage_Catalog_Model_Product) with the same id "xx" already exist." I ONLY want the products that below to all the filtered categories. NOT simply a merger of two categories. – easymoden00b Feb 27 '15 at 15:36
1

You need to make ONE collection, not 'merge two collections'.

With category object you can call getChildren to retrieve every child in a comma separated list (an array, not objects of sub-categories). Iterate as required.

You can convert this list of ids to an array, merge with another similarly derived array and implode the array back to the comma separated list of category IDs.

With this list of ids you can then run your collection, with the categories (that were only ever loaded as ids) put into the query with:

->addAttributeToFilter('category_id', array('in' => array('finset' => $cat_ids)))
  • Just as the answer you attempted to link me to your methodology also returns the same error " Item (Mage_Catalog_Model_Product) with the same id "xx" already exist.". Getting an array of categoryIds is a non-issue. – easymoden00b Feb 27 '15 at 16:20
  • With $collection->getSelect()->group('e.entity_id') it will work, this removes the duplicate results from products that are in both categories. – Fabian Schmengler Mar 2 '15 at 8:14
  • @fschmengler Yes, but the thing is, this simply merges both categories. I only want the items that are within both categories. Not one and/or the other. – easymoden00b Mar 2 '15 at 15:00
  • php.net/manual/en/function.array-intersect.php so rather than merge the two arrays do an intersection. – Henry's Cat Mar 2 '15 at 15:20
  • I did not read that from your question, maybe you should edit it to clarify. As Woolfie said, you are not looking for merge/union, but for intersection. – Fabian Schmengler Mar 2 '15 at 15:46
0

easymoden00b,please try this

$collection->joinField('category_id',
            'catalog/category_product',
            'category_id',
            'product_id=entity_id',
            null,
            'left'
        )
->addAttributeToFilter('category_id', array('in' => array('finset' => 773,1550)))
    ->addAttributeToSelect('*');
$collection->getSelect()->group('e.entity_id');
  • I ran the resultant toString() on the collection through my mysql application and it appears that your methodology doesn't filter the collection at all. – easymoden00b Feb 27 '15 at 14:58
  • let me check... – Amit Bera Feb 27 '15 at 14:59
  • Sorry I used Mage::log((string)$collection->getSelect()); to get the full sql action, but you get it. – easymoden00b Feb 27 '15 at 15:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.