আমি পণ্যের তালিকা আনতে একটি পণ্য সংগ্রহস্থল ব্যবহার করার চেষ্টা করছি। আমি একটি AND
মানদণ্ডের সাথে মিলিত দুটি ফিল্টারের ভিত্তিতে আনতে চাই , তবে জিনিসগুলি কাজ করছে বলে মনে হয় না। ফিল্টার গ্রুপগুলি কীভাবে কাজ করে তা আমি বুঝতে পারি না? নাকি এটি একটি বাগ যা রিপোর্ট করা উচিত?
বিশেষত, (সরলতার জন্য নির্বোধ উদাহরণ) আমার এমন একজন নির্মাতা রয়েছে যেখানে আমি ফিল্টার নির্মাতা, ফিল্টার গ্রুপ নির্মাতা এবং একটি অনুসন্ধানের মানদণ্ড নির্মাতাকে ইনজেক্ট করি where
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);
কলটি সফল হয় তবে আমি দুটি পণ্য ফিরে পাই। অর্থাৎ এসকিউ ফিল্টারটি একটি হিসাবে প্রয়োগ করা 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'))
এটি কি বাগ? এই কাজটি করার কোনও উপায় কি (সরাসরি পণ্য সংগ্রহের উপর সরাসরি নির্ভর করে এবং সংগ্রহাগুলি খনন করে)?