ম্যাজেন্টো 2: পণ্য সংগ্রহস্থল, ফিল্টার গ্রুপ এবং `And``


12

আমি পণ্যের তালিকা আনতে একটি পণ্য সংগ্রহস্থল ব্যবহার করার চেষ্টা করছি। আমি একটি 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')) 

এটি কি বাগ? এই কাজটি করার কোনও উপায় কি (সরাসরি পণ্য সংগ্রহের উপর সরাসরি নির্ভর করে এবং সংগ্রহাগুলি খনন করে)?


2
আমি এখনও পর্যন্ত এই অঞ্চলটি ব্যক্তিগতভাবে সন্ধান করি নি, তবে সাইরিলসচুমাচার.কম / ২০১/0 / ২০১1 / ২০১২ / // কার্যকর হতে পারে।
অ্যালান কেন্ট

উত্তর:


15

বলার আসল টীকা \Magento\Framework\Api\Search\FilterGroup(শ্রেণি পিএইচপিডোক):

একটি লজিকাল ওআর ব্যবহার করে দু'একটি বেশি ফিল্টারকে একত্রে গ্রুপ করে

এর অর্থ হ'ল প্রত্যেকটিতে একটি করে ফিল্টার সহ আপনার দুটি গ্রুপ তৈরি করা দরকার।


এই ক্লিয়ারিং জন্য ধন্যবাদ। আপনি কেবল ম্যাজেন্টো 2 :
পি-এ

2

Magento 2 এ একইভাবে সমস্ত ফিল্টার অপারেটর FilterGroupব্যবহার করে যুক্ত করা হবে OR। তবে সমস্ত অপারেটর FilterGroupব্যবহার করে যুক্ত করা হবে AND। সুতরাং আপনাকে FilterGroupনীচের মত একাধিক গুলি যুক্ত করতে হবে :

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$searchCriteria = $objectManager->create('\Magento\Framework\Api\SearchCriteria');
$filter = $objectManager->create('\Magento\Framework\Api\Filter');
$filter->setField('category_id');
$filter->setValue(array(1, 2, 3));
$filter->setConditionType('in');

$filterGroup = $objectManager->create('\Magento\Framework\Api\Search\FilterGroup');
$filterGroup->setFilters([$filter]);

$filterEnabled = $objectManager->create('\Magento\Framework\Api\Filter');
$filterEnabled->setField('status');
$filterEnabled->setValue(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
$filterEnabled->setConditionType('eq');

$filterGroupEnabled = $objectManager->create('\Magento\Framework\Api\Search\FilterGroup');
$filterGroupEnabled->setFilters([$filterEnabled]);


$searchCriteria->setFilterGroups([$filterGroup, $filterGroupEnabled]);

অনুসন্ধানের মানদণ্ড সম্পর্কে আরও বিশদ এবং যৌক্তিক সংমিশ্রণগুলিতে আপনি Magento-2 অনুসন্ধানের মানদণ্ডে সন্ধান করতে পারেন


এটি ভুল। যুক্তিটি প্রতি সংগ্রহের ভিত্তিতে প্রয়োগ করা হয়।
অ্যালান ঝড়

হাই @ অ্যালান ঝড়, এটি পরীক্ষিত সমাধান। আমি এটি ম্যাজেন্টো ২.১.০-এ ডিফল্ট স্টোরের জন্য পরীক্ষা করেছি। এটিকে ভুল ঘোষণা করার কোন যুক্তি কি আপনার আছে, স্যার?
কমল সিং

@ কারনালসিংহ এই বাগ: github.com/magento/magento2/issues/4287
অ্যালান ঝড়

@ অ্যালান ঝড়, আমি আমার উত্তরে এটি উল্লেখ করেছি। সমস্ত ফিল্টার গোষ্ঠীগুলি অ্যান্ড অপারেটর ব্যবহার করে যোগদান করেছে এবং একক ফিল্টার গ্রুপের সমস্ত ফিল্টারগুলি ওয়ার অপারেটর ব্যবহার করে ম্যাজেন্টো 2 অনুসন্ধানের মানদণ্ডের ডকুমেন্টেশন অনুসারে যোগদান করেছে। আমি উল্লেখ করেছি যে এই সমাধানটি ডিফল্ট স্টোর দিয়ে পরীক্ষা করা হয়। আপনার মন্তব্য অনুসারে এই উত্তরটি কী ভুল করে, আমি তা পাই নি।
কমল সিং

@ কামেলসিংহ আপনি যে সংযুক্ত বাগ রিপোর্টটি পড়েছেন তা কি পড়েছেন? তাদের উদ্দেশ্যপ্রণোদিত আচরণ নির্বিশেষে, ফিল্টার এবং ফিল্টার গ্রুপগুলির আচরণ শেষ পর্যন্ত তারা যে সংগ্রহস্থলের মধ্যে রয়েছে তার আচরণের উপর নির্ভরশীল
অ্যালান স্টর্ম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.