Zend_Db_Table - 在事务重复条目错误中删除后插入

时间:2011-11-21 09:37:48

标签: php transactions zend-db-table duplicates

我正在开发一个系统,其中我有一个实体'程序',它通过链接表有一些'位置'。我正在使用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语句没有正确执行。但删除语句正确返回删除的条目数量,如果我在删除后执行选择,则条目似乎被正确删除。

同样的问题发生在带有文件标签的类似结构中。

我不知道造成这种情况的原因以及如何解决这个问题,如果你们中的任何人拥有它会很好,因为它阻碍了系统的功能。

1 个答案:

答案 0 :(得分:0)

这是我的应用程序中的其他地方的一个错误导致程序::$locations数组包含重复的项目。