今天我面临着一个有趣的任务。我需要在合理的时间内立即更新多达数千种产品的属性。我的第一个想法是加载一系列产品,然后保存该集合。在引擎盖下,保存集合只需通过该集合中的所有型号循环循环,并在模型上调用保存方法。
当我测试代码时,我在这个方向上开始,magento扔了以下错误:
例外‘zend_db_statement_exception.’ with message ‘SQLSTATE [23000]:完整性约束违规:1048列‘value’ cannot be null’
在与其他其他开发人员进行咨询后,我意识到,因为一个集合没有加载整个产品,而是只加载整个产品,而且只加载产品的子集’属性。我尝试加载每一个产品并保存它,但这结果令人痛苦。它会花费几个小时来节省几百个产品。显然,这是不可接受的。
我开始集思广益,我意识到我可以使用大众产品属性更新页面使用的相同方法。在调查此方法后,我意识到我只能发送每个属性更新的一个值。要绕过此限制,请使用新的属性值设置一个数组,其中包含具有该特定值的所有产品数组的值。此数组通过循环馈送,并为每个值调用更新属性方法。这结果是非常快,它简化了这种过程。
以下代码是我最终使用以更新属性的代码。
1 2 3 4 5 6 7 8 9 10 11 |
// $产品是需要更新的产品集合 // $ ProductArray包含具有以下格式的数组: //数组('productId'=> 'value to add') Foreach. ($产品 作为 $产品) { $新的 = $产品->.;getPopularity.() + $产品array.[$产品->.;getid.()]; $ProductData.[$新的][] = $产品->.;getid.(); } Foreach. ($ProductData. 作为 $流行值 =>.; $Pidarray) { 法师:: getsingleton.('目录/ product_action') ->.;updateattributes.($Pidarray, <a HREF.="http://www.php.net/array" 目标=“_空白的” rel.=“noopener”>大批</a>(“人气” =>.; $流行值), 0); } |
有关保存产品属性的前一个博客文章 这里。我在1162个产品集合的两种方法之间进行了比较。使用此方法采用6.233485秒,使用各个保存方法达到8.680476秒。虽然这种方法更快,但是两种方法之间的差异与相同的值数成比例。因此,2000年的集合范围超过5个值,将帮助超过2000的集合,其中1000个值。