2011-11-21 2 views
1

링크 테이블을 통해 '위치'가있는 엔티티 '프로그램'이있는 시스템을 개발 중입니다. 젠드 프레임 워크를 Zend_Db_Table과 함께 사용하고 있습니다.Zend_Db_Table - 트랜잭션 중복 엔트리 오류에서 삭제 후 삽입

위치 1 ----- * programlocation * ------ (1 개) 프로그램 내 매퍼에서

을 내가 저장하는 기능을 가지고() 프로그램 저장해야하는 :

public function save(Application_Model_Program $program) 
{ 
    try 
    { 
     //start transaction 
     $this->_getDbTable()->getAdapter()->beginTransaction(); 

     //make sure category is saved (has an id) 
     $categoryMapper = new Application_Model_Mapper_ProgramCategory(); 
     $categoryMapper->save($program->getCategory()); 

     $programData = array(
      'title'=>$program->getTitle(), 
      'slug'=>$program->getSlug(), 
      'description'=>$program->getDescription(), 
      'dateFrom'=>$program->getDateFrom()->toString(self::DB_DATE_FORMAT), 
      'dateTo'=>$program->getDateTo()->toString(self::DB_DATE_FORMAT), 
      'category'=>$program->getCategory()->getId() 
     ); 

     if($program->getId() === null) 
     { 
      $newId = $this->_getDbTable()->insert($programData); 
      $program->setId($newId); 
     } 
     else 
     { 
      $where = $this->_getDbTable()->getAdapter()->quoteInto("id = ?", $program->getId()); 
      $this->_getDbTable()->update($programData, $where); 
     } 

     //save locations to program 
     $programProgramLocationMapper = new Application_Model_Mapper_Link_ProgramProgramLocation(); 
     $programProgramLocationMapper->saveLocationsToProgram($program->getLocations(), $program); 

     //commit 
     $this->_getDbTable()->getAdapter()->commit(); 
    } 
    catch(Exception $e) 
    { 
     //rollback transaction 
     $this->_getDbTable()->getAdapter()->rollBack(); 
     throw $e; 
    } 
} 

을 Application_Model_Mapper_Link_ProgramProgramLocation :: saveLocationsToProgram 방법은 다음과 같습니다

public function saveLocationsToProgram(
    array $locations, 
    Application_Model_Program $program) 
{ 
    $deleteWhere = $this->_getDbTable()->getAdapter()->quoteInto("program = ?", $program->getId()); 
    $this->_getDbTable()->delete($deleteWhere); 

    foreach($locations as $location) 
    {   
     $data = array('program'=>$program->getId(), 'location'=>$location->getId()); 
     $this->_getDbTable()->insert($data); 
    } 
} 

내 문제는 예외가 지난 표시 삽입 문에 제기된다 "Mysqli 문 EXE 귀여운 오류 : 'PRIMARY'키에 대해 '1-1'항목이 중복되었습니다. 삽입이 올바르게 실행되지 않기 때문에 delete 문처럼 보입니다. 그러나 delete 문은 삭제 된 항목의 양을 올바르게 반환합니다. 삭제 후에 select를 수행하면 항목이 올바르게 삭제 된 것 같습니다.

동일한 문제가 파일에 태그가있는 유사한 구조에서 발생합니다.

이 문제의 원인과 해결 방법에 대해 알지 못합니다. 시스템의 기능을 방해하는 경우 문제가 될 수 있습니다.

답변

0

내 응용 프로그램의 어딘가에서 프로그램 ::$locations 배열에 중복 된 항목이 포함 된 버그가있었습니다.