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