php – 在使用Symfony和Doctrine的数据库中使用INSERT时忽略重复项

前端之家收集整理的这篇文章主要介绍了php – 在使用Symfony和Doctrine的数据库中使用INSERT时忽略重复项前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一张桌子
  1. CREATE TABLE `sob_tags_articles` (
  2. `tag_id` int(11) NOT NULL,`article_id` int(11) NOT NULL,`id` int(11) NOT NULL auto_increment,PRIMARY KEY (`id`)
  3. ) ENGINE=MyISAM AUTO_INCREMENT=112

和使用Doctrine保存对象的方法

  1. $sbTagsArticles = new SobTagsArticles();
  2. $sbTagsArticles->article_id = $pubId;
  3. $sbTagsArticles->tag_id = $tagId;
  4. $sbTagsArticles->save();

但是如果记录存在同一个$pubId和$tagId,则新记录将插入新PK.

如何用symfony INSERT IGNORE进入表?

  1. $sbTagsArticles->isNew();

返回1.

日Thnx.

  1. try
  2. {
  3. $record->save();
  4. }
  5. catch(Doctrine_Exception $e)
  6. {
  7. if($e->getErrorCode() !== $duplicateKeyCode)
  8. {
  9. /**
  10. * if its not the error code for a duplicate key
  11. * value then rethrow the exception
  12. */
  13. throw $e;
  14. }
  15.  
  16. /**
  17. * you might want to fetch the real record here instead
  18. * so yure working with the persisted copy
  19. */
  20. }

您应该确保在应用程序端而不是sql端存在相同的记录.如果您不希望存在相同的文章/标记组合,则向(article_id,tag_id)添加唯一索引.这应该会产生一个MysqL错误,这个错误反过来会产生一个你可以捕获的学说异常.没有用于保存的忽略标志…您可以使用在DBAL的较低级别(Doctrine_Query,Doctrine_Connection等)运行的标志,但不能从ORM层直接运行.

Doctrine_Record :: isNew()将始终返回true,如果您已经实例化了记录,并将其从数据库中拉出来,否则它无法知道该记录是不是新的.

另外你为什么要使用MyISAM存储引擎?我很确定这会在使用Doctrine时产生更多的开销,因为它需要在PHP端模拟约束.通常,您的架构看起来像这样:

  1. CREATE TABLE `sob_tags_articles` (
  2. `tag_id` int(11) NOT NULL,PRIMARY KEY (`id`),CONSTRAINT `some_unique_constraint_name_1`
  3. FOREIGN KEY `article_id`
  4. REFERENCES `article` (`id`)
  5. ON DELETE CASCADE,CONSTRAINT `some_unique_constraint_name_2`
  6. FOREIGN KEY `tag_id`
  7. REFERENCES `tag` (`id`)
  8. ON DELETE CASCADE
  9. ) ENGINE=InnoDB AUTO_INCREMENT=112

猜你在找的PHP相关文章