Magento Save make insert而不是更新

时间:2015-07-20 09:44:41

标签: php magento zend-db

当我保存自定义模型时,我使用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常量的值),并且该类很好地是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的模型中找到更新,是否可以强制更新?

由于

2 个答案:

答案 0 :(得分:2)

您能否在数据中设置ID,然后尝试将其保存为更新数据。

$tr = Mage::getModel('Middleware/transfer')->load($transfer['transfer_request_id'], 'transfer_request_id');

$tr->setId(11); // Your entity id

$tr->save();

答案 1 :(得分:1)

我分享了对科学的修正,但它只是以相反的方式纠正:

$data = array('sample_id'=>'new_id','custid'=>1,'info'=>'info'); 
$model = Mage::getModel('interface/data')->setData($data); 
$model->save();

sample_id是我的主键:

我期待INSERTION,但由于实体可用的数据,Magento默认会尝试更新。

为什么会这样? 这是因为我的实体已经使用您的自定义值new_id设置了它的primary_key(即sample_id)。由于设置了primary_key,默认情况下Magento假设您要执行UPDATE。因此它会尝试使用sample_id ='new_id'查找记录。但是在此操作中它将失败,因为这些数据不存在于数据库中。

你怎么能克服这个? 但是如果设置了主键,有一种方法可以执行INSERT而不是执行UPDATE。要执行此操作,您需要将_isPkAutoIncrement设置为false。默认情况下,此值设置为yes,表示如果设置了主键,则需要更新。将此值设置为false告诉Magento,我需要INSERT而不是UPDATE。所以把它放在模型文件中。

protected $_isPkAutoIncrement = false;