วิธีที่เร็วที่สุดในการอัปเดตแอตทริบิวต์ในผลิตภัณฑ์ทั้งหมด


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 ใช้เวลา 1.7 วินาทีในการเฉลี่ยและ product_action ใช้เวลา 1.0 วินาทีในการเฉลี่ย อย่างไรก็ตาม$product->getResource()->saveAttribute()ใช้เวลาเฉลี่ย 0.04 วินาทีในการเฉลี่ย ขอบคุณ!
Joshua Pack

มีวิธีใดบ้างที่คล้ายกับวิธีนี้ที่สามารถอัปเดตแอตทริบิวต์ในระดับร้านค้าได้หรือไม่
Robbie Averill

ขอบคุณ @ ยอมรับ Bera - เหลือ 1 คำถาม;) มีวิธีบันทึกหลายคุณลักษณะใน 1 go หรือไม่ ของหนึ่งจะต้องวนรอบการ$product->getResource()->saveAttributeกระทำ ขอบคุณ!!
snh_nl

@amit bera, กรุณาดูmagento.stackexchange.com/questions/201757/นี้ ฉันควรทำอย่างไร ??
abhishek

@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);

สิ่งนี้จะทำงานกับค่าการเลือกหลายค่าได้อย่างไร มัน 'เพิ่ม' ค่าหรือเขียนทับค่าที่เลือกไว้ล่วงหน้าอื่น ๆ

Multiselects 27,42,4711จะถูกบันทึกไว้เป็นปกติจุลภาคคั่นจำนวนเต็มเช่น ดังนั้นหากคุณเปลี่ยนค่าที่จะพูด1ค่าอื่น ๆ จะหายไป แต่สิ่งที่คุณสามารถทำได้คือสิ่งที่CONCAT(value, ',1')หมายถึงการเพิ่มค่าใหม่ไปยังจุดสิ้นสุดคั่นด้วยเครื่องหมายจุลภาค ฉันคิดว่าแม้ว่าคุณจะเพิ่มค่าสองครั้ง แต่ก็ไม่มีปัญหาเพราะ Magento จะกรองมันในครั้งต่อไปที่มีการบันทึกรายการและไม่สนใจค่าที่สอง


การดำเนินการนี้จะอัปเดตครั้งละ 1k เท่านั้นไม่ใช่แบบรวดเร็ว: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…
B00MER

เมื่อฉันเข้าใจรหัสอย่างถูกต้องมันจะเขียนทุก ๆ 1,000 แถว แต่มันจะอัพเดททั้งหมดในแถว
Fabian Blechschmidt

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);
Max Uroda

1
ปัญหาเกี่ยวกับวิธีการนี้คือมันไม่ได้ทำดัชนีผลิตภัณฑ์อีกครั้งดังนั้นคุณอาจไม่เห็นการเปลี่ยนแปลงในส่วนหน้าและเพียงแค่เห็นพวกเขาในแผงการดูแลระบบ ยัง reindex หลังจากการปรับปรุงคุณสามารถเปลี่ยนMage::getSingleton('catalog/resource_product_action')ไปMage::getModel('catalog/product_action')ด้วยพารามิเตอร์เดียวกันแน่นอนดังกล่าวข้างต้น
แชมพู

1
@snh_nl อัปเดตคำตอบ หวังว่านี่จะตอบคำถามของคุณ
Fabian Blechschmidt

5

ผลิตภัณฑ์ 10k ใช้ SQL EAV แค่โคลนน้ำ ต่อคำถามเป็นวิธีที่เร็วที่สุด

ค้นหา attribute_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

ฉันคิดว่าคุณสามารถเลือกย่อยด้วยการอัปเดต แต่เพื่อความง่ายเพราะการสืบค้น 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 รายการคุณลักษณะเดียวกันทั้งหมดได้อย่างไร แต่มีค่าแตกต่างกันสำหรับแอตทริบิวต์ ขอบคุณ
snh_nl

ดูคำตอบของ Amit Bera ด้านบน: magento.stackexchange.com/a/43924/3433
Silas Palmer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.