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;