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'“。所以看起来插入前没有正确执行删除语句。但是,删除语句正确地返回删除条目的数量,如果我在删除后做了选择,条目似乎被正确删除。
同样的问题发生在具有标签到文件的类似结构中。
我不知道是什么导致了这个问题,以及如何解决这个问题,如果你们中的任何一个人拥有它,它会很好,因为它阻碍了系统的功能。