【问题标题】:Magento save attribute value programmatically causes SQL errorMagento 以编程方式保存属性值导致 SQL 错误
【发布时间】:2011-10-17 01:26:21
【问题描述】:

有人可以帮忙吗?

在 Magento 1.5.0.1 中,我正在尝试保存可配置产品的属性值。我使用管理员将我的属性添加到相应的产品中。

我查看了Modify automatically an attribute with magentoProgrammatically change product attribute at store view level,因此能够想出看似简单的代码,但不幸的是,它只在某些时候有效——即对于没有等级价格的可配置产品...

这是一段sn-p代码:

$id = 126;  # id of existing product
$product = Mage::getModel('catalog/product')->load($id);
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 
$product->setx_pos(123);
// tried this too, does not make a difference:  $product->setData('x_pos',  123);
$product->save();

如果可配置产品没有具有等级价格的产品,它会完美运行。它可以有没有等级价格的等级产品,这种情况下可以节省。如果等级产品有等级价格——那么我得到了例外:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '126-1-0-5.0000-0' for key 'UNQ_CATALOG_PRODUCT_TIER_PRICE'
Trace:
#0 C:\magento\app\code\core\Mage\Eav\Model\Entity\Abstract.php(1513):        Mage_Eav_Model_Entity_Abstract->walkAttributes('backend/afterSa...', Array)
#1 C:\magento\app\code\core\Mage\Catalog\Model\Resource\Eav\Mysql4\Product.php(142): Mage_Eav_Model_Entity_Abstract->_afterSave(Object(Mage_Catalog_Model_Product))
#2 C:\magento\app\code\core\Mage\Eav\Model\Entity\Abstract.php(1013):    Mage_Catalog_Model_Resource_Eav_Mysql4_Product->_afterSave(Object  (Mage_Catalog_Model_Product))
#3 C:\magento\app\code\core\Mage\Core\Model\Abstract.php(318):  Mage_Eav_Model_Entity_Abstract->save(Object(Mage_Catalog_Model_Product))
#4 C:\magento\app\design\frontend\default\OneOffFit\template\page\data.phtml(90):  Mage_Core_Model_Abstract->save()

我用谷歌搜索了这个错误 - 唯一的参考是未回答的问题。

为什么在这种情况下 Magento 会更新等级价格?我做错什么了吗?我应该先更新相关产品(它们具有相同的属性但具有未设置的值)吗?或者更确切地说,我应该怎么做?有人可以帮忙吗?

【问题讨论】:

  • 在 Magento 中编写 setter 的传统方式是驼峰式,对于“x_pos”,它应该是 setXPos(123)。这个迂腐不能回答你的问题,但它可能会帮助未来检查你的代码的开发人员。

标签: magento custom-attributes


【解决方案1】:

将此行移到加载命令上方;

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); 

或者,如果您不关心特定于商店的值,请将其完全删除。

【讨论】:

  • 非常感谢!这个移动的 setCurrentStore 以某种方式解决了我的问题。此时我并不关心多个商店,但我相信我在 StackOverflow 或 Magento 中看到了如何处理多个商店的代码。您能否提示一下为什么这会有所帮助-我想更多地了解正在发生的事情。再次感谢,VladJ
  • 问题键UNQ_CATALOG_PRODUCT_TIER_PRICE在表catalog_product_entity_tier_price中定义,它是包括website_id在内的几列的索引。当您在加载和保存对象之间更改当前存储时,它将被视为该对象的新替代版本...但是 website_id 似乎没有更新以匹配,因此它与现有版本冲突这违反了上述唯一密钥。它不直观,可能是一个错误,尽管很容易解决。我认为它是“做一些意想不到的事情导致崩溃”。
【解决方案2】:

在我的情况下,当我将以下代码放在产品负载上方时,错误消失了,但浏览器需要很长时间才能停止。最后属性也没有更新。

知道代码发生了什么吗?

$productId = Mage::getModel('catalog/product')->getIdBySku('68366');
$product =  Mage::getModel('catalog/product')->load($productId);
$product->setMyAttribute('test')
    ->save();

【讨论】:

  • 你找到答案了吗?我有同样的问题,设置自定义属性值,然后 save() 不更新值。
猜你喜欢
  • 2016-09-05
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多