try
{
$record->save();
}
catch(Doctrine_Exception $e)
{
if($e->getErrorCode() !== $duplicateKeyCode)
{
/**
* if its not the error code for a duplicate key
* value then rethrow the exception
*/
throw $e;
}
/**
* you might want to fetch the real record here instead
* so yure working with the persisted copy
*/
}
Вы должны убедиться, что одна и та же запись не существует на стороне приложения, а не на стороне SQL. Если вы не хотите, чтобы существовала одна и та же комбинация статьи / тега, добавьте уникальный индекс к (article_id, tag_id)
. Это должно привести к ошибке mysql, которая, в свою очередь, сгенерирует исключение доктрины, которое вы можете перехватить. Для сохранений нет флага игнорирования ... Возможно, вы сможете использовать один из них, работающий на более низком уровне DBAL (Doctrine_Query, Doctrine_Connection и т. Д.), Но не напрямую со слоя ORM.
Doctrine_Record::isNew()
всегда будет возвращать true, если вы создали экземпляр записи, а не извлекали ее из базы данных, в противном случае у нее нет способа узнать, является ли запись новой или нет.
Кроме того, почему вы используете механизм хранения MyISAM? Я почти уверен, что это на самом деле приведет к дополнительным издержкам при использовании Doctrine, поскольку тогда ему нужно эмулировать ограничения на стороне php. Обычно ваша схема будет выглядеть примерно так:
CREATE TABLE `sob_tags_articles` (
`tag_id` int(11) NOT NULL,
`article_id` int(11) NOT NULL,
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`),
CONSTRAINT `some_unique_constraint_name_1`
FOREIGN KEY `article_id`
REFERENCES `article` (`id`)
ON DELETE CASCADE,
CONSTRAINT `some_unique_constraint_name_2`
FOREIGN KEY `tag_id`
REFERENCES `tag` (`id`)
ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=112