Magento 2.x – How to manage multiple AND and OR conditions to filter / filterGroups
If you are trying to get and filter data for certain collection, using its repository. You will need to to create a Searchcritearia as follows:
- Inject the following dependencies:
123\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder\Magento\Framework\Api\FilterBuilder $filterBuilder\Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder - Perform the needed filters like this:
1234567891011121314151617181920212223// AND$this->searchCriteriaBuilder->addFilter('attribute1','value2');$this->searchCriteriaBuilder->addFilter('attribute2','value2');// OR$attr3 = $this->filterBuilder->setField('attribute3')->setValue('value3')->setConditionType('eq')->create();$attr4 = $this->filterBuilder->setField('attribute4')->setValue('value4')->setConditionType('eq')->create();$filterOr = $this->filterGroupBuilder->addFilter($attr3)->addFilter($attr4)->create();$this->searchCriteriaBuilder->setFilterGroups([$filterOr]);$searchCriteria = $this->searchCriteriaBuilder->create();$this->productRepository->getList($searchCriteria)->getItems();
As a full example, in the below code, we are filtering the cms blocks repository:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
namespace Offset101\CmsMenuFilters\Block\Adminhtml; class CmsMenuFilters extends \Magento\Backend\Block\Template { protected $staticBlockRepository; protected $searchCriteriaBuilder; protected $criteria; protected $filterGroupBuilder; /** * AssignProducts constructor. * * @param \Magento\Backend\Block\Template\Context $context * @param array $data */ public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Cms\Model\BlockRepository $blockRepository, \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder, \Magento\Framework\Api\FilterBuilder $filterBuilder, \Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder, array $data = [] ) { $this->blockRepository = $blockRepository; $this->searchCriteriaBuilder = $searchCriteriaBuilder; $this->filterGroup = $filterGroupBuilder; $this->filterBuilder = $filterBuilder; parent::__construct($context, $data); } public function getPagesInMenu($selected=false) { $storeId = 0; $this->searchCriteriaBuilder->addFilter('store_id',$storeId); $this->searchCriteriaBuilder->addFilter('is_active',1); $this->searchCriteriaBuilder->addFilter('enabled_for_menu_pages', 1); $searchCriteria = $this->searchCriteriaBuilder->create(); return $this->blockRepository->getList($searchCriteria)->getItems(); } } |