我有一张桌子
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。
答案 0 :(得分:13)
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
答案 1 :(得分:6)
这是要使用的实际代码
try
{
$record->save();
}
catch(Doctrine_Connection_Exception $e)
{
if($e->getPortableCode() != Doctrine::ERR_ALREADY_EXISTS)
{
/**
* 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
*/
}
答案 2 :(得分:-1)
您可以使用新的保存方法扩展SobTagsArticles对象,并检查该记录是否已存在:
public function exists() {
$q = Doctrine_Query::create()
->from('sobtagsarticles ta')
->where('ta.tag_id = ? and ta.article_id = ?', array($this->getTagId(), $this->getArticleId()));
if (!$result = $q->execute())
{
parent::save();
}
}
这样只有在不存在的情况下才会保存该对象。
您还可以为表格设置唯一索引,如下所示:
UNIQUE INDEX `sb_tags_articles_unique` (`tag_id` ASC, `article_id` ASC)
您的架构如下所示:
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`),
UNIQUE INDEX `sb_tags_articles_unique` (`tag_id` ASC, `article_id` ASC),
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