脚本宝典收集整理的这篇文章主要介绍了php – 在使用Symfony和Doctrine的数据库中使用INSERT时忽略重复项,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
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`) ) ENginE=MyISam AUTO_INCREMENT=112
和使用Doctrine保存对象的方法:
$sBTagsArticles = new SobTagsArticles(); $sbTagsArticles->article_id = $pubId; $sbTagsArticles->tag_id = $tagId; $sbTagsArticles->save();
但是如果记录存在同一个$pubId和$tagId,则新记录将插入新PK.
如何用symfony INSERT IGNORE进入表?
$sbTagsArticles->isNew();
返回1.
日Thnx.
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)@L_512_6@唯一索引.这应该会产生一个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,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
以上是脚本宝典为你收集整理的php – 在使用Symfony和Doctrine的数据库中使用INSERT时忽略重复项全部内容,希望文章能够帮你解决php – 在使用Symfony和Doctrine的数据库中使用INSERT时忽略重复项所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。