Magento 2: स्टोर आईडी द्वारा उत्पाद संग्रह को कैसे फ़िल्टर किया जाए


11

उत्पाद फैक्टरी ऑब्जेक्ट का उपयोग करके, मैं एक उत्पाद बनाने में सक्षम हूं, उत्पाद संग्रह को हड़प सकता हूं और उस संग्रह का पहला आइटम प्राप्त कर सकता हूं

/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();

हालाँकि, अगर मैं संग्रह के फ़िल्टर में store_id जोड़ने का प्रयास करता हूँ

    $product = $this->productFactory
        ->create()
        ->getCollection()
        ->addFieldToFilter('store_id', 1)
        ->getFirstItem();

मुझे निम्नलिखित त्रुटि मिलती है

Invalid attribute name: store_id
#0 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(1434): Magento\Eav\Model\Entity\Collection\AbstractCollection->_addAttributeJoin('store_id', 'inner')
#1 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(359): Magento\Eav\Model\Entity\Collection\AbstractCollection->_getAttributeConditionSql('store_id', 1, 'inner')
#2 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Catalog/Model/Resource/Product/Collection.php(1489): Magento\Eav\Model\Entity\Collection\AbstractCollection->addAttributeToFilter('store_id', 1, 'inner')
#3 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(382): Magento\Catalog\Model\Resource\Product\Collection->addAttributeToFilter('store_id', 1)
...
#63 {main}

अगर मैं store_id द्वारा फ़िल्टर करने के लिए उत्पाद रिपॉजिटरी का उपयोग करने का प्रयास करता हूं (रिपॉजिटरी हुड के तहत संग्रह का उपयोग करता है) तो यही बात होती है।

क्या यह एक बग है? या Magento 2 में स्टोर, वेबसाइट और उत्पादों के बीच संबंध ऐसे बदल गए हैं कि यह अब वैध क्वेरी नहीं है? दोनों? न तो? कुछ और?


मैं M2 में बहुत नया हूं, लेकिन क्या आप इस github.com/magento/magento2/blob/develop/app/code/Magento/… का उपयोग नहीं कर सकते ?
fmrng

@fnng पता करने के लिए उपयोग विधि, लेकिन मैं कहना चाहता हूं "कृपया मुझे उन सभी उत्पादों की एक सूची प्राप्त करें जो स्टोर एक्स का हिस्सा हैं"। निश्चित नहीं है कि कैसे setStoreId ऐसा करेगा।
एलन स्टॉर्म

जवाबों:


5

आप विधि के साथ ऐसा कर सकते हैं addStoreFilter(), देखेंMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

addStoreFilter()समारोह की दुकान आईडी या स्वीकार करेंगे Storeएक पैरामीटर के रूप वस्तु।

ईजी, वर्तमान स्टोर के लिए सभी उत्पाद प्राप्त करने के लिए :

public function getProducts(){
    return $this->collection->addStoreFilter($this->_storeManager->getStore()); 
}

उम्मीद है, यह मदद करता है।


धन्यवाद @amitbeta! यदि आपके पास एक पल है - तो क्या आप जानते हैं कि उत्पाद रिपॉजिटरी का उपयोग करके स्टोर फ़िल्टर बनाना संभव है? magento.stackexchange.com/questions/91278/…
एलन स्टॉर्म

यकीन है कि .. मैं दिखेगा
अमित बेरा

@AmitBera, आप उत्पाद संग्रह में addStoreFilter () का उपयोग करने का तरीका थोड़ा स्पष्ट कर सकते हैं।

5

अभी के लिए यह एक बग जैसा दिखता है, क्योंकि स्टोर फिल्टर को ProductRepository::getList()विधि के साथ लागू करने की कोई संभावना नहीं है , SearchCiteria के फिल्टर के रूप में स्टोर आईडी पास करना

गेटलिस्ट कार्यान्वयन में, आप पा सकते हैं कि SearchCriteria के सभी फ़िल्टर संग्रह पर लागू होते हैं

    foreach ($searchCriteria->getFilterGroups() as $group) {
        $this->addFilterGroupToCollection($group, $collection);
    }

में Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionलिए विशेष प्रबंधन है श्रेणी फिल्टर , लेकिन वहाँ की दुकान के लिए कोई नहीं है।

इसलिए, अतिरिक्त स्थिति को जोड़ा जाना चाहिए, Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionजिसमें यह जांचा जा सके कि क्या हमारे पास स्टोर फिल्टर है और यदि हमारे पास - संग्रह के लिए स्टोर आईडी सेट, कुछ इस तरह से:

        if ($filter->getField() == \Magento\Catalog\Model\Product::STORE_ID) {
            $collection->setStore($filter->getValue());
            continue;
        }

इस समस्या के लिए आंतरिक बग बनाया गया, इसकी संख्या MAGETWO-45950 है


उस पर कोई खबर? मुझे जीथब पर टिकट नंबर का संदर्भ नहीं मिल रहा है।
फैबियन शेंगलर

1
Magento में 2 उत्पादों को वेबसाइटों पर असाइन किया जाता है, स्टोरों को नहीं। इसलिए, एलन द्वारा वर्णित प्रारंभिक व्यवहार सही है, क्योंकि उत्पाद इकाई में स्टोर आईडी लिंक नहीं है, बस वेबसाइट आईडी से लिंक करें। और आंतरिक टिकट ProductInterface में
ProductWebsiteLinkInterface के

स्टोर / वेबसाइट एसोसिएशन के अलावा, यह setStore()भी निर्दिष्ट नहीं करता है कि कौन से स्टोर विशिष्ट विशेषता मान प्राप्त कर रहे हैं? या अब यह एक अलग तरीके से किया जाता है?
फेबियन शेंगलर

उत्पाद मॉडल कार्यान्वयन में setStoreId / getStoreId विधियाँ हैं, लेकिन ProductInterface में कोई भी नहीं हैं, इसलिए आपके व्यावसायिक तर्क में उन पर भरोसा करने की अनुशंसा नहीं की जाती है।
इगोर मिनायलो

अब StoreView स्तर मानों (उदाहरण के लिए, विशेषताओं का स्थानीयकरण) के लिए हल करके REST API में StoreID URL भाग द्वारा बनाया गया
इगोर मिन्यलो

0

यदि आप कई तालिकाओं के साथ कस्टम मॉडल का उपयोग करते हैं जैसे table_name जोड़ें: addFieldToFilter('**table_name.**column_name', 1)


क्या आप कृपया मेरे कॉलम कहो इकाई आईडी से उत्पाद संग्रह लोड करने के लिए पूरे स्निपेट को साझा कर सकते हैं, जैसा कि आपने ऊपर कहा है
सुशीवम ush

0

1) वर्ग है \Magento\Catalog\Model\ResourceModel\Category\Collection:

/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
$collection = $this->categoryFactory->create()->getCollection()
        ->addFieldToSelect('*');

2) फिर विधि है $collection->setStoreId(0);


PS के बजाय 0 पर आप अपना स्टोर आईडी 1, 2, ... रख सकते हैं
Giedrius Tumelis

मेटा: किसी कारण से स्टार प्रतीक को मेरे संदेश से हटा दिया गया था।
गिदरीस तुमेलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.