更新Magento产品属性的更有效方法

时间:2012-03-20 08:57:38

标签: php magento attributes e-commerce

刚刚负责更新大约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 />";
}

问题是,正如我已经读过 - &gt; save()函数需要大约3秒钟的产品,我也尝试了 - &gt; 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

有人可以解释我做错了什么吗?

2 个答案:

答案 0 :(得分:3)

您可以使用以下内容,其中$productPids是一系列产品ID。

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

但是在您的场景中,您必须拥有1个产品的数组,因为它是为大量更新相同值而设计的,而不是大量更新不同值。

在您的情况下,我倾向于(尽管社区没有提倡)使用SQL脚本进行更改,但执行时间不到一秒。

或者,如果您坚持使用Mage API,然后禁用所有索引的所有“保存更新”设置,您将大幅减少$product->save()次,但仍然无法接近执行原始SQL语句。

答案 1 :(得分:0)

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