2011-11-21 121 views
1

我正在開發一個系統,其中有一個實體「程序」,其中有一些「位置」通過鏈接表。我使用Zend Framework和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); 
    } 
} 

我的問題是將引發異常在最後顯示INSERT語句「的mysqli聲明EXE可愛的錯誤:'PRIMARY'鍵重複輸入'1-1'「。所以看起來插入前沒有正確執行刪除語句。但是,刪除語句正確地返回刪除條目的數量,如果我在刪除後做了選擇,條目似乎被正確刪除。

同樣的問題發生在具有標籤到文件的類似結構中。

我不知道是什麼導致了這個問題,以及如何解決這個問題,如果你們中的任何一個人擁有它,它會很好,因爲它阻礙了系統的功能。

回答

0

這是我的應用程序中的其他地方的錯誤,導致程序::$locations數組包含重複的項目。