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!