当我保存自定义模型时,我使用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的模型中找到更新,是否可以强制更新?
由于
答案 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;