सभी उत्पादों में विशेषता को अपडेट करने का सबसे तेज़ तरीका


14

मैं बहुत सारे उत्पादों (10.000 से अधिक) के लिए मूल्य को अपडेट करने की कोशिश कर रहा हूं। जिस तरह से मैं अभी कर रहा हूं वह बेहद समय लेने वाला है। सभी उत्पादों के माध्यम से लूप और उनमें से अधिकांश को अपडेट करने का सबसे अच्छा तरीका कौन सा है?

धन्यवाद


जवाबों:


22

हाय Magento नीचे दिए गए कोड द्वारा एक विशेषता प्रदान करते हैं

$product->setAttributeCode($newValue)
$ProductObject->getResource()->saveAttribute($product, 'attribute_Code');

उदाहरण:

$product=Mage::getModel('catalog/product')->load($id);
$product->setSpecialFromDate('2010-10-28');
// below code use for time format 
$product->setSpecialFromDateIsFormated(true);
$product->getResource()->saveAttribute($product, 'special_from_date');

उत्पाद संग्रह का उपयोग करना:

$productIds = array(1,3,2);
$products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('entity_id', array('in' => $productIds));

foreach($products as $product)
{
    $product->setSpecialFromDate('2010-10-28');
    // below code use for time format 
    $product->setSpecialFromDateIsFormated(true);
    $product->getResource()->saveAttribute($product, 'special_from_date');


}

यह सुपर फास्ट है! मैं कोशिश की है Mage::getSingleton('catalog/product_api')->update();और Mage::getSingleton('catalog/product_action')->updateAttributes()। product_api ने avg पर 1.7 सेकंड और product_action ने avg पर 1.0 सेकंड का समय लिया। हालांकि, $product->getResource()->saveAttribute()avg पर avg 0.04 Seconds लिया। धन्यवाद!
यहोशू पैक 20

क्या इस पद्धति के समान कुछ है जो एक निश्चित स्टोर स्तर पर विशेषताओं को अपडेट कर सकता है?
रोबी एवेरिल

Thx @Amit बेरा - 1 प्रश्न शेष;) 1 जाने में कई विशेषताओं को सहेजने का एक तरीका भी है? किसी को $product->getResource()->saveAttributeकार्रवाई के आसपास लूप करना होगा । धन्यवाद!!
snh_nl

@amit bera, pls इस magento.stackexchange.com/questions/201757/ पर गौर करें। मुझे क्या करना चाहिए ??
अभिषेक

@amit: मुझे वेबसाइट कैसे बदल सकती है (मल्टी-स्टोर में अपडेट विशेषता)
zus

18

SQL क्वेरी लिखें।

दूसरा सबसे अच्छा तरीका (और जो मैं सुझाता हूं): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

कोड उदाहरण u_maxx द्वारा:

$allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds();
$attributeCode = 'some_eav_attribute';
$attributeValue = NULL;
$attrData = array( $attributeCode => $attributeValue );
$storeId = 0;
// no reindex:<
Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);

यह बहुस्तरीय मूल्यों के साथ कैसे काम करेगा? क्या यह मूल्य जोड़ता है या अन्य पूर्व-चयनित मानों को अधिलेखित करता है

बहुविकल्पी आम तौर पर अल्पविराम से अलग पूर्णांक के रूप में सहेजे जाते हैं, जैसे 27,42,4711। इसलिए यदि आप कहने के लिए मान बदलते हैं 1, तो अन्य मान खो जाते हैं। लेकिन आप जो कर सकते हैं वह कुछ ऐसा है जैसे CONCAT(value, ',1')अल्पविराम द्वारा अलग किए गए नए मूल्य को अंत तक जोड़ना। मुझे लगता है कि भले ही आप दो बार एक मूल्य जोड़ते हैं, यह कोई समस्या नहीं है, क्योंकि मैगेंटो अगली बार यह फ़िल्टर करता है कि आइटम सहेजा गया है और दूसरे मूल्य को अनदेखा करता है।


यह केवल 1k पंक्तियों को एक समय में अपडेट करेगा, न कि जितनी जल्दी: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…
B00MER

जब मैं कोड को सही ढंग से समझता हूं तो यह प्रत्येक 1000 पंक्तियों को लिखता है, लेकिन यह एक पंक्ति में सभी को अपडेट करता है।
फेबियान ब्लेस्च्मिड्ट

1
धन्यवाद @FabianBlechschmidt! यहाँ मेरी कोड उदाहरण (है सार :)<?php $allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds(); $attributeCode = 'some_eav_attribute'; $attributeValue = NULL; $attrData = array( $attributeCode => $attributeValue ); $storeId = 0; Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allProductIds, $attrData, $storeId);
मैक्स Uroda

1
इस दृष्टिकोण के साथ समस्या यह है कि यह उत्पादों को बाधित नहीं करता है, इसलिए हो सकता है कि आप दृश्यपटल में परिवर्तन न देखें और उन्हें केवल व्यवस्थापक पैनल में देखें। भी अद्यतन के बाद आप बदल सकते हैं पुन: अनुक्रमणिका करने के लिए Mage::getSingleton('catalog/resource_product_action')करने के लिए Mage::getModel('catalog/product_action')साथ में ठीक उसी मापदंडों ऊपर उल्लेख किया है।
शैम्पू

1
@snh_nl ने उत्तर को अपडेट किया। आशा है कि यह आपके प्रश्न का उत्तर देगा
Fabian Blechschmidt

5

10k उत्पाद, SQL का उपयोग करें। ईएवी सिर्फ पानी को पिघलाता है। प्रति प्रश्न सबसे तेज़ तरीका है।

Attra_id ढूंढें

SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'

attribute_idउपरोक्त क्वेरी से पाया गया अपडेट ।

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

मुझे लगता है कि आप अद्यतन के साथ एक subselect कर सकते हैं, लेकिन सरलता के लिए दो SQL प्रश्नों को समझना आसान है।

नोट: entity_type_id = 4 सबसे हमेशा उत्पाद EAV प्रविष्टियों है। यदि आपको बड़े पैमाने पर अद्यतन श्रेणी या ग्राहक विशेषताओं की आवश्यकता होती है, तो यह अलग-अलग और साथ ही साथ अद्यतन की गई तालिका के आधार पर भिन्न होगी। इसके अलावा अगर आपके पास मल्टी-स्टोर सेटअप है तो सुनिश्चित करें और नोट और कंडीशन करेंstore_id


2

ऊपर फैबियन के जवाब के आगे, आप एक बार में कई फ़ील्ड अपडेट कर सकते हैं। नीचे दिए गए उदाहरण में केवल 2 (स्टॉक, स्टॉक की स्थिति) है, लेकिन आप जितना चाहें उतना उपयोग कर सकते हैं।

    $product_ids = Mage::getModel('catalog/product')
        ->getCollection()
        ->addAttributeToFilter('status', array('eq' => 2)) //only disabled 
        ->getAllIds();

    $attrData = [
        ['attribute_one' => 1],
        ['attribute_two' => 1]
    ];

    $storeId = 0;
    Mage::getSingleton('catalog/resource_product_action')
       ->updateAttributes($product_ids, $attrData, $storeId);

तो यह है अगर आप सभी उत्पादों को अद्यतन करना चाहते हैं, तो वह एक ही विशेषता मूल्य है - आप इसे कैसे कह सकते हैं अद्यतन करने के लिए कह सकते हैं 3 उत्पादों, सभी एक ही विशेषता है, लेकिन विशेषता के लिए विभिन्न मूल्यों के साथ? thx
snh_nl

ऊपर अमित बेरा का जवाब देखें: magento.stackexchange.com/a/43924/3433
सीलास पामर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.