मैं उत्पादों की सूची लाने के लिए एक उत्पाद भंडार का उपयोग करने की कोशिश कर रहा हूं। मैं दो फिल्टर के आधार पर एक AND
मापदंड के साथ संयुक्त करना चाहता हूं , लेकिन चीजें काम नहीं कर रही हैं। क्या मुझे समझ नहीं आ रहा है कि फ़िल्टर समूह कैसे काम करते हैं? या यह एक बग है जिसे रिपोर्ट किया जाना चाहिए?
विशेष रूप से, (सादगी के लिए मूर्खतापूर्ण उदाहरण) मेरे पास एक निर्माता है जहां मैं एक फ़िल्टर बिल्डर, फ़िल्टर समूह बिल्डर और एक खोज मापदंड बिल्डर इंजेक्ट करता हूं
public function __construct(
\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
\Magento\Framework\Api\FilterBuilder $filterBuilder,
\Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder
)
{
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->filterBuilder = $filterBuilder;
$this->filterGroupBuilder = $filterGroupBuilder;
}
फिर, बाद में एक विधि में, मैं दो फ़िल्टर बनाने के लिए फ़िल्टर बिल्डरों का उपयोग करता हूं
$filter1 = $this->filterBuilder->setField('sku')
->setValue('24-MB01')
->setConditionType('eq')
->create();
$filter2 = $this->filterBuilder->setField('sku')
->setValue('WT08-XS-Black')
->setConditionType('eq')
->create();
फिर मैं एक फिल्टर ग्रुप बनाने के लिए फिल्टर ग्रुप बिल्डर का उपयोग करता हूं जिसमें ये दो फिल्टर होते हैं
$filter_group = $this->filterGroupBuilder
->addFilter($filter1)
->addFilter($filter2)
->create();
फिर मैंने एक खोज मापदंड बिल्डर का उपयोग किया, उस पर फ़िल्टर समूह सेट किया
$criteria = $this->searchCriteriaBuilder
->setFilterGroups([$filter_group])
->setPageSize(100)
->create();
return $criteria
अंत में, जब मैं एक उत्पाद भंडार के साथ इस मानदंड का उपयोग करता हूं (अन्यत्र उपयोग किया जाता है, तो कंस्ट्रक्शन और डाय को छोड़कर भ्रम से बचने के लिए)
/* @var Magento\Catalog\Api\ProductRepositoryInterface */
$list = $productRepository->getList($searchCriteria);
कॉल succesfull है लेकिन मुझे दो उत्पाद वापस मिल गए हैं। यानी एसकेयू फिल्टर को ए के रूप में लागू किया गया था OR
, न कि ए AND
। मुझे उम्मीद है कि यह क्वेरी कुछ भी नहीं लौटाएगी।
अगर मैं Magento\Catalog\Api\ProductRepository
कक्षा में खुदाई करता हूं , और संग्रह की चुनिंदा प्रतिमा पर एक नज़र डालता हूं
protected function addFilterGroupToCollection(
\Magento\Framework\Api\Search\FilterGroup $filterGroup,
Collection $collection
) {
//...
if ($fields) {
$collection->addFieldToFilter($fields);
}
//printf lives in my heart forever
echo($collection->getSelect()->__toString());
exit;
}
मैं मापदंड को एक के साथ जोड़कर देखता हूं OR
SELECT `e`.*, IF(at_status.value_id > 0, at_status.value, at_status_default.value) AS `status`, IF(at_visibility.value_id > 0, at_visibility.value, at_visibility_default.value) AS `visibility`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_product_entity_int` AS `at_status_default` ON (`at_status_default`.`entity_id` = `e`.`entity_id`) AND (`at_status_default`.`attribute_id` = '94') AND `at_status_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_int` AS `at_status` ON (`at_status`.`entity_id` = `e`.`entity_id`) AND (`at_status`.`attribute_id` = '94') AND (`at_status`.`store_id` = 1)
INNER JOIN `catalog_product_entity_int` AS `at_visibility_default` ON (`at_visibility_default`.`entity_id` = `e`.`entity_id`) AND (`at_visibility_default`.`attribute_id` = '96') AND `at_visibility_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_int` AS `at_visibility` ON (`at_visibility`.`entity_id` = `e`.`entity_id`) AND (`at_visibility`.`attribute_id` = '96') AND (`at_visibility`.`store_id` = 1)
WHERE ((`e`.`sku` = '24-MB01') OR (`e`.`sku` = 'WT08-XS-Black'))
क्या यह एक बग है? क्या इस काम को करने के लिए एक तरीका है (उत्पाद संग्रहों पर सीधे भरोसा करना और रिपॉजिटरी को खोदना)?