【问题标题】:Symfony2 Doctrine, flush entityManager skip uniquesSymfony2 Doctrine,刷新 entityManager 跳过唯一性
【发布时间】:2014-03-18 02:50:23
【问题描述】:

我有这个方法:

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放在循环中,但这让它慢得要命。我还可以在循环中进行查询以检查单词是否已经存在,但这也会大大减慢速度。

有没有其他方法可以让学说跳过独特的冲突并继续在刷新时插入其余部分?

如果我将其放入尝试中,catch 它会捕获异常,但它不会插入任何行。

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案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();
    

    【讨论】:

    • 是的,但是单词必须包含所有单词,超过 100 万个输入
    • 啊,好吧,我强烈建议直接通过DBAL(本机SQL,不要与NativeQuery 混淆)直接进行数据量。然后你可以使用INSERT IGNOREwitch 来完成这项工作......
    猜你喜欢
    • 2023-03-03
    • 2011-08-15
    • 2015-03-16
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多