2015-07-20 6 views
3

У меня странное поведение с использованием Magento (1.4, старая версия, которую я знаю), когда я сохраняю пользовательскую модель.Magento Сохранить вставку вместо обновления

   $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?

Благодаря

ответ

1

делится починкой для науки, но это исправление только в обратном порядке:

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

sample_id является моим первичным ключом:

Я ожидаю прошивку, но из-за данные, доступные объекту, Magento попытается выполнить UPDATE по умолчанию.

Почему так происходит? Это потому, что мой объект имеет primary_key (т.е. sample_id) уже установлен с вашим пользовательским значением new_id. Поскольку primary_key установлен, Magento по умолчанию, предположим, что вы хотите выполнить UPDATE. Поэтому он попытается найти запись с sample_id = 'new_id'. Но это не сработает в этой операции, поскольку такие данные не существуют в базе данных.

Как вы можете это преодолеть? Но есть способ сделать INSERT, а не делать UPDATE, если установлен первичный ключ. Чтобы выполнить это, вам нужно установить значение _isPkAutoIncrement равным false. По умолчанию это значение установлено на yes, что указывает на необходимость обновления, если установлен первичный ключ. установив это значение в false, сообщите Magento, что мне нужен INSERT, а не UPDATE. Поэтому поместите это в свой файл модели.

protected $_isPkAutoIncrement = false; 
+1

Я искал часы, пытаясь понять это. Спасибо @nicolas D! –

2

Можете ли вы установить Id, а также в данных, а затем попытаться сохранить это работает в качестве обновления данных.

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

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

$tr->save(); 
+0

Привет, Когда я сделать это на самом деле хуже, чем ожидалось, я не знаю, как, но Magent вставить новый идентификатор (который разве один в параметре на SETID) ... Я могу перестать пытаться с Magento s запрос навсегда в этом случае –

Смежные вопросы