Zend_Db_Table - вставляет после удаления в ошибку повторяющейся записи транзакции - PullRequest
1 голос
/ 21 ноября 2011

Я разрабатываю систему, в которой у меня есть сущность «программа», которая имеет несколько «местоположений» через таблицу ссылок.Я использую Zend Framework с Zend_Db_Table.

location 1 ----- * programlocation * ------ 1 program

В моем маппере есть функция 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» для ключа «ПЕРВИЧНЫЙ» ».Так что, кажется, оператор удаления до вставки не выполняется правильно.Но оператор delete правильно возвращает количество удаленных записей, и, если я сделаю выбор после удаления, записи будут удалены правильно.

Та же проблема возникает в аналогичной структуре с тегами для файлов.

Я понятия не имею, что является причиной и как ее решить, если у кого-то из вас это будет замечательно, поскольку она блокирует функциональность системы.

1 Ответ

0 голосов
/ 05 декабря 2011

Это была ошибка где-то еще в моем приложении, из-за которой массив ::$locations программы содержал дублированные элементы.

...