2011-11-21 115 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数组包含重复的项目。