1

I'm trying to filter product collection with multiple OR filter with this code :

$values = ['xxx','xxx'];
$filters = [];
$filters[] = $this->_filterBuilder
->setField('field_a')->setConditionType('in')
->setValue($values)
->create();

$filters[] = $this->_filterBuilder
->setField('field_b')
->setConditionType('in')
->setValue($values)
->create();

// two more filter like that
$filterGroup = $this->_filterGroupBuilder
            ->setFilters($filters)
            ->create();

 $searchCriteria = $this->_searchCriteriaBuilder
            ->setFilterGroups([$filterGroup])
            ->create();
 $products = $this->_productRepository->getList($searchCriteria)->getItems();

Problem is collection return 0 result instead of two. After analyze sql query generated by Magento eav table are joined with INNER JOIN like that :

INNER JOIN `catalog_product_entity_text` AS `at_field_b` ON (`at_field_b`.`row_id` = `e`.`row_id`) AND (`at_field_b`.`attribute_id` = '204') AND (`at_field_b`.`store_id` = 0)

If on raw sql query I execute it by replacing INNER JOIN by LEFT JOIN it works, i've got my results.

So my question is how can I "force" magento to left join instead of inner ? Or maybe it's a pure coincidence and real reason isn't the left/inner join

I didn't precise but field_a,field_b,etc... aren't not required so they could be empty for products

dharth
  • 179
  • 4
  • 12
  • The getList() method called collectionProcessor then on filterProcessor (method addFilterGroupToCollection) it's $collection->addFieldToFilter($fields) which do the job so it explain the inner join – dharth Jun 19 '19 at 07:30

0 Answers0