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!