Cách nhanh nhất để cập nhật một thuộc tính trong tất cả các sản phẩm


Câu trả lời:


22

Hi Magento cung cấp một thuộc tính bằng mã bên dưới

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

Thí dụ:

$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');

Sử dụng Bộ sưu tập sản phẩm:

$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');


}

Đây là siêu nhanh! Tôi đã thử Mage::getSingleton('catalog/product_api')->update();Mage::getSingleton('catalog/product_action')->updateAttributes(). Product_api mất 1,7 giây trên avg và Product_action mất 1,0 giây trên avg. tuy nhiên, $product->getResource()->saveAttribute()mất trên 0,04 giây trên avg. Cảm ơn!
Gói Joshua

Có bất cứ điều gì tương tự như phương pháp này có thể cập nhật các thuộc tính ở một cấp độ cửa hàng nhất định không?
Robbie Averill

Thx @Amit Bera - 1 câu hỏi còn lại;) có cách nào để lưu nhiều thuộc tính trong 1 go không? Của một người sẽ phải vòng quanh $product->getResource()->saveAttributehành động. CÁM ƠN!!
snh_nl

@amit bera, làm ơn nhìn vào magento.stackexchange.com/questions/201757/ tôi nên làm gì đây ??
abhishek

@amit: Tôi cần làm thế nào tôi có thể thay đổi hàng loạt trang web (cập nhật thuộc tính trong nhiều cửa hàng)
zus

18

Viết một truy vấn SQL.

Cách tốt nhất thứ hai (và cách tôi khuyên dùng): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

Mã ví dụ của 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);

Làm thế nào điều này sẽ làm việc với các giá trị multiselect? Liệu nó 'thêm' giá trị hoặc ghi đè lên các giá trị được chọn trước khác

Nhiều lựa chọn thường được lưu dưới dạng số nguyên được phân tách bằng dấu phẩy, như 27,42,4711. Do đó, nếu bạn thay đổi giá trị để nói 1, các giá trị khác sẽ bị mất. Nhưng những gì bạn có thể làm là một cái gì đó như CONCAT(value, ',1')có nghĩa là thêm giá trị mới vào cuối, được phân tách bằng dấu phẩy. Tôi nghĩ ngay cả khi bạn thêm một giá trị hai lần, điều này không có vấn đề gì, vì Magento sẽ lọc nó vào lần tiếp theo mục được lưu và bỏ qua giá trị thứ hai.


Điều này sẽ chỉ cập nhật 1k hàng tại một thời điểm, không nhanh như sau: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/
Lỗi

Khi tôi hiểu mã chính xác, nó viết mỗi 1000 hàng, nhưng nó cập nhật tất cả trong một hàng.
Fabian Blechschmidt

1
Cảm ơn bạn @FabianBlechschmidt! Dưới đây là ví dụ mã của tôi ( ý chính ):<?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
Vấn đề với cách tiếp cận này là nó không giới thiệu lại các sản phẩm, vì vậy bạn có thể không thấy các thay đổi ở lối vào và chỉ nhìn thấy chúng trong bảng quản trị. Để cũng reindex sau khi cập nhật, bạn có thể thay đổi Mage::getSingleton('catalog/resource_product_action')để Mage::getModel('catalog/product_action')có các thông số chính xác cùng đề cập ở trên.
gội đầu

1
@snh_nl cập nhật câu trả lời. Hy vọng điều này trả lời câu hỏi của bạn
Fabian Blechschmidt

5

Sản phẩm 10k, sử dụng SQL. EAV chỉ làm vẩn đục nước. Mỗi câu hỏi là cách nhanh nhất.

Tìm thuộc tính_id

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

Cập nhật với tìm thấy attribute_idtừ truy vấn trên.

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

Tôi cho rằng bạn có thể thực hiện một mục phụ với bản cập nhật nhưng để đơn giản vì hai truy vấn SQL dễ nắm bắt nhất.

LƯU Ý: entity_type_id = 4 hầu hết luôn là các mục EAV của sản phẩm. Trong trường hợp bạn cần cập nhật hàng loạt danh mục hoặc thuộc tính khách hàng, điều này sẽ khác nhau cũng như bảng được cập nhật dựa trên loại thuộc tính mà nó đang cập nhật. Ngoài ra nếu bạn có thiết lập nhiều cửa hàng, hãy chắc chắn và lưu ý và điều kiệnstore_id


2

Hơn nữa với câu trả lời của Fabian ở trên, bạn có thể cập nhật nhiều trường cùng một lúc. Ví dụ dưới đây chỉ có 2 (trong kho, trạng thái chứng khoán), nhưng bạn có thể sử dụng bao nhiêu tùy thích.

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

Vì vậy, đây là nếu bạn muốn cập nhật tất cả các sản phẩm có cùng giá trị thuộc tính - làm thế nào bạn có thể điều chỉnh điều này để cập nhật 3 sản phẩm, tất cả cùng một thuộc tính, nhưng với các giá trị khác nhau cho thuộc tính? thx
snh_nl

Xem câu trả lời của Amit Bera ở trên: magento.stackexchange.com/a/43924 43233
Silas Palmer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.