Skip to main content

Magento2: How to Add Multiple AND and OR Conditions to Filter/FilterGroups

Magento2: How to Add Multiple AND and OR Conditions to Filter/FilterGroups

Introduction

In Magento 2, filtering collections using multiple AND and OR conditions can be achieved using SearchCriteriaBuilder, FilterBuilder, and FilterGroupBuilder. This article demonstrates how to apply complex filters in Magento 2 repositories with Dependency Injection (DI).

Injecting Dependencies

Before using filters, inject the necessary dependencies in your class:

use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\FilterGroupBuilder;
use Magento\Catalog\Api\ProductRepositoryInterface;

class ProductFilterExample
{
    private $searchCriteriaBuilder;
    private $filterBuilder;
    private $filterGroupBuilder;
    private $productRepository;

    public function __construct(
        SearchCriteriaBuilder $searchCriteriaBuilder,
        FilterBuilder $filterBuilder,
        FilterGroupBuilder $filterGroupBuilder,
        ProductRepositoryInterface $productRepository
    ) {
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
        $this->filterBuilder = $filterBuilder;
        $this->filterGroupBuilder = $filterGroupBuilder;
        $this->productRepository = $productRepository;
    }

Applying AND and OR Conditions

Example 1: AND with OR Condition

To create a filter where:

attribute1 = 'value1' AND attribute2 = 'value2' AND (attribute3 = 'value3' OR attribute4 = 'value4')

Use the following code:

    public function getFilteredProducts()
    {
        // Create AND conditions
        $this->searchCriteriaBuilder->addFilter('attribute1', 'value1');
        $this->searchCriteriaBuilder->addFilter('attribute2', 'value2');

        // Create OR conditions
        $filterOr = $this->filterGroupBuilder
            ->addFilter(
                $this->filterBuilder->setField('attribute3')->setValue('value3')->setConditionType('eq')->create()
            )
            ->addFilter(
                $this->filterBuilder->setField('attribute4')->setValue('value4')->setConditionType('eq')->create()
            )
            ->create();

        $this->searchCriteriaBuilder->setFilterGroups([$filterOr]);
        
        $searchCriteria = $this->searchCriteriaBuilder->create();
        return $this->productRepository->getList($searchCriteria);
    }

Example 2: (attribute1 = 'value1' OR attribute2 = 'value2') AND (attribute3='value3' OR attribute4 = 'value4')

For an alternative case where both groups have OR conditions:

    public function getFilteredProductsWithMultipleOr()
    {
        // First OR group
        $filterOr1 = $this->filterGroupBuilder
            ->addFilter(
                $this->filterBuilder->setField('attribute1')->setValue('value1')->setConditionType('eq')->create()
            )
            ->addFilter(
                $this->filterBuilder->setField('attribute2')->setValue('value2')->setConditionType('eq')->create()
            )
            ->create();

        // Second OR group
        $filterOr2 = $this->filterGroupBuilder
            ->addFilter(
                $this->filterBuilder->setField('attribute3')->setValue('value3')->setConditionType('eq')->create()
            )
            ->addFilter(
                $this->filterBuilder->setField('attribute4')->setValue('value4')->setConditionType('eq')->create()
            )
            ->create();

        // Add both OR groups
        $this->searchCriteriaBuilder->setFilterGroups([$filterOr1, $filterOr2]);
        
        $searchCriteria = $this->searchCriteriaBuilder->create();
        return $this->productRepository->getList($searchCriteria);
    }

Conclusion

Using SearchCriteriaBuilder, FilterBuilder, and FilterGroupBuilder, you can efficiently apply complex AND and OR conditions when fetching products or other entities in Magento 2. This approach ensures modular and scalable filtering while maintaining clean code organization.

If you have any questions, feel free to ask!

Tags