我正在开发一个系统,其中我有一个实体'程序',它通过链接表有一些'位置'。我正在使用Zend Framework和Zend_Db_Table。
位置1 ----- * programlocation * ------ 1程序
在我的映射器中,我有一个函数save(),它应该保存程序:
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语句执行错误:重复条目'1-1'用于键'PRIMARY'”。所以看来插入前的delete语句没有正确执行。但删除语句正确返回删除的条目数量,如果我在删除后执行选择,则条目似乎被正确删除。
同样的问题发生在带有文件标签的类似结构中。
我不知道造成这种情况的原因以及如何解决这个问题,如果你们中的任何人拥有它会很好,因为它阻碍了系统的功能。
答案 0 :(得分:0)
这是我的应用程序中的其他地方的一个错误导致程序::$locations
数组包含重复的项目。