2012-03-20 2 views
3

Только что было задано обновление около 3 тыс. SKU. Я написал сценарий, который выглядит следующим образом:Более эффективный способ обновления атрибута на продукте Magento

if($updates_handle) { 
    while($sku_entry=fgetcsv($updates_handle, 1024, ",")) { 

     /* get the old and new Product SKU values */ 
     list($old_sku, $new_sku) = $sku_entry; 

     echo 'Setting: '.$old_sku.' SKU to: '.$new_sku.'<br />'; 

     $product = Mage::getModel('catalog/product')->loadByAttribute('skuref1', $old_sku); 

     $product->setSku($new_sku); 

//  $product->getResource()->saveAttribute($product, 'Sku'); 
//  
//  $product->save(); 


    } 
    echo "<br />DONE<br />"; 
} 

Проблема заключается в том, и, как я прочитал -> Сохранить() функция занимает около 3 секунд продукта, я также попробовал -> saveAttribute, но дает мне ошибку:

Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'catalog_product_entity.value_id' in 'field list'' in /var/www/website/httpdocs/lib/Zend/Db/Statement/Pdo.php:234 Stack trace: #0 /var/www/website/httpdocs/lib/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array) #1 /var/www/website/httpdocs/lib/Zend/Db/Adapter/Abstract.php(468): Zend_Db_Statement->execute(Array) #2 /var/www/website/httpdocs/lib/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query('SELECT `catalog...', Array) #3 /var/www/website/httpdocs/lib/Varien/Db/Adapter/Pdo/Mysql.php(333): Zend_Db_Adapter_Pdo_Abstract->query('SELECT `catalog...', Array) #4 /var/www/website/httpdocs/lib/Zend/Db/Adapter/Abstract.php(799): Varien_Db_Adapter_Pdo_Mysql->query(Object(Varien_Db_Select), Array) #5 /var/www/website/httpdocs/app/code/core/Mag in /var/www/website/httpdocs/lib/Zend/Db/Statement/Pdo.php on line 234 

Может кто-нибудь объяснить, что я делаю неправильно?

+1

sku не является атрибутом eav, поэтому 'saveAttribute()' не может использоваться для его сохранения. – Zyava

ответ

0

использование модели magento для массового обновления - очень медленный метод. Однако существует модель Mage_Catalog_Model_Product_Action, которая используется для массового обновления в magento admin. Вы можете найти его метод updateAttributes очень полезный

3

Вы можете использовать следующее, где $productPids - это массив идентификаторов продуктов.

Mage::getSingleton('catalog/product_action') 
    ->updateAttributes($productPids, array('sku' => 'my_sku'), 0); 

Но в вашем случае, вы должны иметь массив 1 продукта, так как это предназначено для массового обновления одного и того же значения, а не массовое обновление различных значений.

В вашем случае я был бы склонен (хотя и не был защищен сообществом), чтобы внести изменения с помощью SQL-скрипта, для выполнения потребуется меньше секунды.

Или, если вы настаиваете на том, чтобы придерживаться API Mage, отключите все настройки «Обновить при сохранении» для всех индексов, вы потеряете $product->save() раз значительным отрывом, но все равно нигде не приблизитесь к простому выполнению необработанного SQL.

+0

Можем ли мы использовать это решение для обновления категорий продукта? – Muk

+0

У меня есть 20 тыс. Продуктов, по умолчанию все продукты назначают обе веб-сайты в мульти-магазине. Как удалить все продукты с одного веб-сайта в мульти-магазине? – Rathinam

Смежные вопросы