2012-03-20 33 views
3

剛剛負責更新約3k 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 2012-03-20 11:33:04

回答

0

使用magento模型進行批量更新是一個非常慢的方法。 但是有一個模型Mage_Catalog_Model_Product_Action,用於magento admin中的批量更新。你可以找到它的方法updateAttributes非常有用

3

您可以使用以下,其中$productPids是一個產品ID數組。

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

但在你的情況,你就必須有1種產品的陣列,因爲這是專爲相同的值,不同的值而不是大規模更新的大規模更新。

就你而言,我傾向於(儘管社區不提倡)用SQL腳本進行更改,但執行時間不到一秒鐘。或者,如果你堅持堅持使用Mage API,那麼爲所有索引禁用所有「保存更新」設置,你會以大幅度下降$product->save()次,但仍然遠不及執行原始數據SQL語句。

+0

我們可以使用此解決方案更新產品的類別嗎? – Muk 2015-12-29 09:20:41

+0

我有20K的產品,默認情況下,所有產品都分配給多個商店的網站。如何從多個商店中選定的一個網站中刪除所有產品? – Rathinam 2018-01-02 13:19:48