Magento Save 进行插入而不是更新
Magento Save make insert instead of update
当我保存自定义模型时,使用 Magento(1.4,我知道的旧版本)有一个奇怪的行为。
$tr = Mage::getModel('Middleware/transfer')->load($transfer['transfer_request_id'], 'transfer_request_id');
var_dump(get_class($tr));
var_dump($tr->getfkState());
$tr->setData('fk_state', Middleware_Model_TransferState::TRANSFER_STATE_RECEIVED_MIDDLEWARE);
var_dump($tr->getfkState());
$tr->save();
我的 var_dump 给了我一些很好的信息,状态从最初的 0 变为 1(我的 TRANSFER_STATE_RECEIVED_MIDDLEWARE 常量的值),class 很好 Middleware_Model_Transfer.
但是,保存尝试执行插入而不是更新,我得到以下错误
PHP Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '11' for key 'PRIMARY'' in magento/lib/Zend/Db/Statement/Pdo.php:234
我完全理解我的 transfer_request_id 上有一个重复的键,这显然是真的,但是为什么当我需要更新我得到的数据时 Magento 试图插入。
如果在 Magento 中的模型上找到,是否可以强制更新?
谢谢
能否请您设置 Id,也在数据中,然后尝试将其保存为更新数据。
$tr = Mage::getModel('Middleware/transfer')->load($transfer['transfer_request_id'], 'transfer_request_id');
$tr->setId(11); // Your entity id
$tr->save();
我分享了一个科学的修正,但它只是以相反的方式纠正:
$data = array('sample_id'=>'new_id','custid'=>1,'info'=>'info');
$model = Mage::getModel('interface/data')->setData($data);
$model->save();
sample_id 是我的主键:
我希望插入,但由于实体可用的数据,Magento 默认会尝试执行更新。
为什么会这样?
这是因为我的实体已将其 primary_key(即 sample_id)设置为您的自定义值 new_id。由于设置了 primary_key,默认情况下,Magento 假设您要执行更新。所以它会尝试查找 sample_id = 'new_id' 的记录。但由于数据库中不存在此类数据,因此此操作将失败。
你如何克服这个问题?
但是如果设置了主键,有一种方法可以执行 INSERT 而不是执行 UPDATE。要执行此操作,您需要将 _isPkAutoIncrement 设置为 false。默认情况下,此值设置为 yes,表示如果设置了主键,我们需要更新。将此值设置为 false 告诉 Magento,我需要一个 INSERT 而不是 UPDATE。所以把它放在你的模型文件中。
protected $_isPkAutoIncrement = false;
当我保存自定义模型时,使用 Magento(1.4,我知道的旧版本)有一个奇怪的行为。
$tr = Mage::getModel('Middleware/transfer')->load($transfer['transfer_request_id'], 'transfer_request_id');
var_dump(get_class($tr));
var_dump($tr->getfkState());
$tr->setData('fk_state', Middleware_Model_TransferState::TRANSFER_STATE_RECEIVED_MIDDLEWARE);
var_dump($tr->getfkState());
$tr->save();
我的 var_dump 给了我一些很好的信息,状态从最初的 0 变为 1(我的 TRANSFER_STATE_RECEIVED_MIDDLEWARE 常量的值),class 很好 Middleware_Model_Transfer.
但是,保存尝试执行插入而不是更新,我得到以下错误
PHP Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '11' for key 'PRIMARY'' in magento/lib/Zend/Db/Statement/Pdo.php:234
我完全理解我的 transfer_request_id 上有一个重复的键,这显然是真的,但是为什么当我需要更新我得到的数据时 Magento 试图插入。 如果在 Magento 中的模型上找到,是否可以强制更新?
谢谢
能否请您设置 Id,也在数据中,然后尝试将其保存为更新数据。
$tr = Mage::getModel('Middleware/transfer')->load($transfer['transfer_request_id'], 'transfer_request_id');
$tr->setId(11); // Your entity id
$tr->save();
我分享了一个科学的修正,但它只是以相反的方式纠正:
$data = array('sample_id'=>'new_id','custid'=>1,'info'=>'info');
$model = Mage::getModel('interface/data')->setData($data);
$model->save();
sample_id 是我的主键:
我希望插入,但由于实体可用的数据,Magento 默认会尝试执行更新。
为什么会这样? 这是因为我的实体已将其 primary_key(即 sample_id)设置为您的自定义值 new_id。由于设置了 primary_key,默认情况下,Magento 假设您要执行更新。所以它会尝试查找 sample_id = 'new_id' 的记录。但由于数据库中不存在此类数据,因此此操作将失败。
你如何克服这个问题? 但是如果设置了主键,有一种方法可以执行 INSERT 而不是执行 UPDATE。要执行此操作,您需要将 _isPkAutoIncrement 设置为 false。默认情况下,此值设置为 yes,表示如果设置了主键,我们需要更新。将此值设置为 false 告诉 Magento,我需要一个 INSERT 而不是 UPDATE。所以把它放在你的模型文件中。
protected $_isPkAutoIncrement = false;