我有一个带有 EAV 结构的自定义 Magento 模块。它可以创建、编辑、删除和列出项目。
当我编辑和保存项目时,属性值不会被数据库中的新值替换。在管理员上,我看到了新值,但在数据库中旧值也存在。
我作为管理员用户看到的内容:
- 项目编辑
- 从测试 1 t 测试 2 更改名称
- 保存成功
- 现在,项目的名称是测试 2
我在数据库中看到的内容:
- value_id、entity_type_id、attribute_id、store_id、entity_id、value
- 旧行:5、31、961、0、5、测试 1
- 新行:6、31、961、0、5、测试2
在代码中:
public function saveAction()
{
if ($postData = $this->getRequest()->getPost()) {
$model = Mage::getSingleton('mynamespace/model');
$model->setData($postData);
if ($this->getRequest()->getParam('id')) {
$model->setId($this->getRequest()->getParam('id'));
}
try {
$model->save();
Mage::getSingleton('adminhtml/session')->addSuccess($this->__('Item has been saved.'));
$this->_redirect('*/*/');
return;
}
catch (Mage_Core_Exception $e) {
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
}
catch (Exception $e) {
Mage::getSingleton('adminhtml/session')->addError($this->__('An error occurred while saving this item.'));
}
$this->_redirectReferer();
}
}
我第一次有一排。保存后我有两行,再次保存后我有三... 为什么 setData() 或 setName() 函数不能覆盖/更新旧行?为什么它会创建新行?我该如何解决?
安装程序文件:
$installer = $this;
$installer->startSetup();
$eavTableName = 'loremipsum/lorem';
$installer->addEntityType(
'loremipsum_lorem', array(
'entity_model' => $eavTableName,
'table' => $eavTableName
)
);
$installer->createEntityTables(
$this->getTable('loremipsum/lorem')
)->addIndex(
$this->getIdxName(
$eavTableName,
array('entity_id', 'attribute_id', 'store_id'),
Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE
),
array('entity_id', 'attribute_id', 'store_id'),
array('type' => Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE)
);
$this->addAttribute('loremipsum_lorem', 'name', array(
'type' => 'varchar',
'label' => 'Name',
'input' => 'text',
'class' => '',
'backend' => '',
'frontend' => '',
'source' => '',
'required' => true,
'user_defined' => true,
'default' => '',
'unique' => false
));
$installer->endSetup();