加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 22:40:26 所属栏目: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`)) ENGINE=MyISAM AUTO_INCREMENT=112 和使用Doctrine保存对象的方法: $sbTagsArticle
我有一张桌子
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)添加唯一索引.这应该会产生一个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读