1

를 업데이트하지 않습니다. 이 메서드는 테이블에 행을 저장하거나 업데이트할지 여부를 자동으로 결정해야한다는 것을 알고 있습니다. 두 형식을 만들었습니다. 하나는 데이터베이스에 레코드를 만들기위한 것이고, 다른 하나는 업데이트 용입니다. 새 레코드를 만들면 완벽하게 작동합니다. 메서드는 INSERT MySQL 명령을 사용합니다. 행을 업데이트하려고 할 때, MySQL 명령 UPDATE를 선택하는 대신 save() 메소드는 여전히 INSERT를 선택하고 테이블의 레코드를 복제합니다. 여기 Zend_Db_Table_Row : 저장() 나는 젠드 프레임 워크 1.12.1</p> <p>내가 Zend_Db_Table_Abstract에서 행에 "저장"방법을 사용하려고 함께 일하고 테이블

전체 오류 로그입니다 :

Message: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'France' for key 'country' 

Stack trace: 

#0 C:\wamp\zf\library\Zend\Db\Statement.php(303): Zend_Db_Statement_Pdo->_execute(Array) 
#1 C:\wamp\zf\library\Zend\Db\Adapter\Abstract.php(480): Zend_Db_Statement->execute(Array) 
#2 C:\wamp\zf\library\Zend\Db\Adapter\Pdo\Abstract.php(238): Zend_Db_Adapter_Abstract->query('INSERT INTO `co...', Array) 
#3 C:\wamp\zf\library\Zend\Db\Adapter\Abstract.php(576): Zend_Db_Adapter_Pdo_Abstract->query('INSERT INTO `co...', Array) 
#4 C:\wamp\zf\library\Zend\Db\Table\Abstract.php(1076): Zend_Db_Adapter_Abstract->insert('countries', Array) 
#5 C:\wamp\zf\library\Zend\Db\Table\Row\Abstract.php(467): Zend_Db_Table_Abstract->insert(Array) 
#6 C:\wamp\zf\library\Zend\Db\Table\Row\Abstract.php(438): Zend_Db_Table_Row_Abstract->_doInsert() 
#7 C:\wamp\www\website\library\App\Data.php(34): Zend_Db_Table_Row_Abstract->save() 
#8 C:\wamp\www\website\application\controllers\CountryController.php(82): App_Data->save() 
#9 C:\wamp\zf\library\Zend\Controller\Action.php(516): CountryController->editAction() 
#10 C:\wamp\zf\library\Zend\Controller\Dispatcher\Standard.php(308): Zend_Controller_Action->dispatch('editAction') 
#11 C:\wamp\zf\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) 
#12 C:\wamp\zf\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch() 
#13 C:\wamp\zf\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run() 
#14 C:\wamp\www\website\public\index.php(26): Zend_Application->run() 
#15 {main} 

나는 테이블에 { 'ID를'레코드를 업데이트하려고 => '1', '국가'=> '프랑스', '대륙'= > '', 'created'=> 'modified'=> ''}

save() 메소드가 Zend_Db_Table_Row_Abstract -> _ doUpdate()를 강제로 선택하는 방법이 있습니까? 메서드 대신 _doInsert()?

정말 대단합니다.

+0

저장할 데이터 배열을 표시 하시겠습니까? 'id' 필드를 설정하면 새로운 필드를 삽입하려고 시도하는 대신 레코드를 업데이트합니다. – Rikesh

+0

폼에 호출 된 배열은 Array입니다. ([id] => 1, [country] => France, [continent] => 유럽, [created] => 2013-03-06 19:27:09, [modified ] =>)'. 변경 후, Zend_Db_Table_Row_Abstract는 다음과 같습니다 :'( 'controller'=> 'country', 'action'=> 'edit', 'id'=> '1', 'module'=> ' ', 'country '=>'France ', '대륙 '=>'유럽 ', '생성 '=>'2013-03-06 19:27:09 ', 'modified '=>'2013- ')' –

+0

'Zend_Db_Table_Row'는 새로운'Zend_Db_Table_Row'를 생성하면'Zend_Db_Table_Row'가 데이터베이스에서 이전에 가져온 경우에만 업데이트됩니다. '는 기존의 PK 또는 UNIQUE 키와 일치하더라도 INSERT 명령을 통해 저장하고 UPDATE 명령은 저장하지 않습니다. –

답변

0

우리는 모두 추측하고 있기 때문에 일부 코드를 추가하기 위해 질문을 업데이트해야 할 수도 있습니다.

다음은 배열 대신 엔티티 모델을 사용하여 mapper에서 save()가 작동하는 방식의 간단한 예입니다. 새 행 save() 것이다 INSERT를 만들 경우 기존 행 save() 것이다 UPDATE를 제출하는 경우

public function saveArtist(Music_Model_Artist $artist) 
    { 
     //if id is set fetch the row 
     if (!is_null($artist->id)) { 
      $select = $this->getGateway()->select(); 
      $select->where('id = ?', $artist->id); 
      $row = $this->getGateway()->fetchRow($select); 
     } else { 
      //if id is not set create a new row 
      $row = $this->getGateway()->createRow(); 
     } 
     // this data is added to the record always 
     $row->name = $artist->name; 
     //save/update the row 
     $row->save(); 
     //return the whole row, my preference as save() just returns primary key of row. 
     return $row; 
    } 

은 정말 무슨 일이 있습니다. 이 방법에는 전달 된 데이터를 기반으로 수행되는 작업을 제어하는 ​​마법이 없습니다. 구체적이어야하며 훌륭하게 작동합니다.

앱은이 UPDATE 일을 할 당신이하려는 때 INSERT을하고있는 것으로 보인다.