Я разрабатываю систему, в которой у меня есть сущность «программа», которая имеет несколько «местоположений» через таблицу ссылок.Я использую 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 правильно возвращает количество удаленных записей, и, если я сделаю выбор после удаления, записи будут удалены правильно.
Та же проблема возникает в аналогичной структуре с тегами для файлов.
Я понятия не имею, что является причиной и как ее решить, если у кого-то из вас это будет замечательно, поскольку она блокирует функциональность системы.