Symfony2 Doctrine,flush entityManager跳过uniques

时间:2014-03-17 18:22:37

标签: php symfony doctrine-orm

我有这个方法:

while ($line = fgets($fh)) {
    $word = new Word();
    $word->setWord(trim($line));
    $word->setCreatedAt(new \DateTime());
    $word->setPriority(1);
    $em->persist($word);
}
$em->flush();

现在,字段字包含一个唯一约束,所以如果最后一个$ em-> flush();偶然发现重复的条目。我可以简单地将flush置于循环中,但这会让它变得如此慢。我也可以在循环中进行查询以检查单词是否已经存在,但这也会大大减慢它。

还有其他方法可以让学说跳过唯一的冲突并继续将其余部分插入冲洗吗?

如果我试一试,抓住它会捕获异常,但它不会插入任何行。

1 个答案:

答案 0 :(得分:1)

您可以通过存储已保存在数组中的单词来跟踪已处理的单词。像这样的东西?

$words = array();

while ($line = fgets($fh)) {
    $key = trim($line)
    $word = new Word();
    $word->setWord($key);
    $word->setCreatedAt(new \DateTime());
    $word->setPriority(1);

    if ( !in_array($key, $words)){
        $words[] = $key;    
        $em->persist($word);
    }
}

$em->flush();