Magento 2: उत्पाद रिपोजिटरी, फ़िल्टर समूह और `और`


12

मैं उत्पादों की सूची लाने के लिए एक उत्पाद भंडार का उपयोग करने की कोशिश कर रहा हूं। मैं दो फिल्टर के आधार पर एक 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')) 

क्या यह एक बग है? क्या इस काम को करने के लिए एक तरीका है (उत्पाद संग्रहों पर सीधे भरोसा करना और रिपॉजिटरी को खोदना)?


2
मैंने व्यक्तिगत रूप से अभी तक इस क्षेत्र पर ध्यान नहीं दिया है, लेकिन cyrillschumacher.com/2015/01/02/… उपयोगी हो सकता है।
एलन कैंट

जवाबों:


15

\Magento\Framework\Api\Search\FilterGroupकहते हैं (वर्ग phpDoc) का वास्तविक एनोटेशन :

तार्किक या का उपयोग करके समूह दो या अधिक फ़िल्टर एक साथ

इसका मतलब है कि आपको प्रत्येक में एक फिल्टर के साथ दो समूह बनाने की आवश्यकता है।


यह स्पष्ट करने के लिए धन्यवाद। आप बस Magento 2 में सभी अमूर्तता की परतें प्यार करने के लिए मिला:
--P

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 खोज मानदंड पर पा सकते हैं


यह गलत है। तर्क को प्रति रिपॉजिटरी के आधार पर लागू किया जाता है।
एलन स्टॉर्म

हाय @ एलन तूफान, यह परीक्षण समाधान है। मैंने इसे Magento 2.1.0 में डिफ़ॉल्ट स्टोर के लिए परीक्षण किया है। क्या आपके पास इसे गलत घोषित करने का कोई औचित्य है, सर?
कमल सिंह


@ एलन स्टॉर्म, यही मैंने अपने उत्तर में उल्लेख किया है। सभी फ़िल्टर समूह AND ऑपरेटर के उपयोग से जुड़ गए हैं और सभी फ़िल्टर समूह में सभी फ़िल्टर Magento 2 खोज मापदंड प्रलेखन के अनुसार OR ऑपरेटर का उपयोग करके जुड़ गए हैं। मैंने उल्लेख किया है कि यह समाधान डिफ़ॉल्ट स्टोर के साथ परीक्षण किया गया है। आपकी टिप्पणी के अनुसार यह उत्तर क्या गलत है, मुझे नहीं मिला।
कमल सिंह

@KamelSingh क्या आपने मुझसे जुड़ी बग रिपोर्ट पढ़ी है? उनके इच्छित व्यवहार के बावजूद, फ़िल्टर और फ़िल्टर समूहों का व्यवहार अंततः उस रिपॉजिटरी के व्यवहार पर निर्भर करता है जिसमें वे हैं।
एलन स्टॉर्म
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.