我正在使用来自外部服务器的json请求来更新Magento中的产品(请不要问为什么我们不只是使用api的...)而我现在正在尝试更新属性信息,似乎是资源摘要中的_uniqueCheck()方法失败了。问题是我不知道如何解决它。以下代码
$attribute_model = Mage::getModel('eav/entity_attribute');
$attributeId = $attribute_model->getIdByCode('catalog_product', $attribute_code);
$attribute = $attribute_model->load($attributeId);
$attribute->setData($data)->save();
导致以下错误:
[29-May-2013 16:32:00 UTC] PHP Fatal error: Uncaught exception 'Mage_Core_Exception' with message 'Attribute with the same code already exists.' in .../app/Mage.php:594
Stack trace:
#0 .../app/code/core/Mage/Core/Model/Resource/Db/Abstract.php(676): Mage::throwException('Attribute with ...')
#1 .../app/code/core/Mage/Core/Model/Resource/Db/Abstract.php(424): Mage_Core_Model_Resource_Db_Abstract->_checkUnique(Object(Mage_Eav_Model_Entity_Attribute))
#2 .../app/code/core/Mage/Core/Model/Abstract.php(318): Mage_Core_Model_Resource_Db_Abstract->save(Object(Mage_Eav_Model_Entity_Attribute))
#3 .../app/code/local/Valoran/Import/Model/Attribute.php(25): Mage_Core_Model_Abstract->save()
#4 .../app/code/local/Valoran/Harmony/Model/Messaging/Attributeset.php(115): Valoran_Import_Model_Attribute->_create(Array)
#5 .../app/code/local/Valoran/Harmony/Model/Messaging/Attributeset.php(23): Valoran_Harmony_Model_Messaging_Attribut in .../app/Mage.php on line 594
这对我来说很令人沮丧,因为我知道所有代码都已存在,我正在尝试进行更新,这就是我调用的原因 - > load($ id)....
有没有人对我在这里缺少的东西有任何想法?我现在正在探索使用Mage_Eav_Model_Entity_Setup :: updateAttribute方法来完成此任务,但到目前为止我遇到了同样的错误。
答案 0 :(得分:1)
我看到发生这种情况的两个可能原因。它们都与setData()
方法的使用有关。当您使用数组作为参数调用它时,它将只替换模型的受保护属性$_data
。此属性包含加载/保存到数据库的所有信息。
我怀疑您的$data
变量中没有entity_attribute_id
密钥。如果调用setData()
时就是这种情况,则删除已加载属性的id。您可能正在使用已由系统中其他属性使用的attribute_code
。
无论如何,当您保存属性magento检查entity_attribute_id时,如果它是空的,magento假定您要创建新属性,以便它对新属性执行验证。这导致找到具有相同代码的属性是非法的并且抛出错误。此属性可能是您加载的属性,但您删除了entity_attribute_id
属性或其他具有相同attribute_code
如果您不想使用Mage_Eav_Model_Entity_Setup::updateAttribute
,可以尝试拨打
$attribute = $attribute_model->load($attributeId);
$data['entity_attribute_id'] = $attribute->getEntityAttributeId();
$attribute->setData($data)->save();