刚刚负责更新大约 3k SKU。我写了一个如下所示的脚本:
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 />";
}
问题是,正如我所读到的 ->save() 函数需要大约 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
谁能解释一下我做错了什么?
最佳答案
您可以使用以下内容,其中 $productPids
是产品 ID 数组。
Mage::getSingleton('catalog/product_action')
->updateAttributes($productPids, array('sku' => 'my_sku'), 0);
但在您的场景中,您必须拥有一个包含 1 个产品的数组,因为这是为相同值的大量更新而不是不同值的大量更新而设计的。
在您的情况下,我倾向于(尽管社区不提倡)使用 SQL 脚本进行更改,执行时间不到一秒钟。
或者,如果您坚持使用 Mage API,然后禁用所有索引的所有“保存时更新”设置,您将减少 $product->save()
次可观的差距,但仍远不及仅执行原始 SQL 语句。
关于php - 更新产品属性的更有效方法,Magento,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783806/