简体   繁体   中英

Symfony2 Doctrine, flush entityManager skip uniques

i have this method:

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

Now, the field word contains a unique constraint, so i get an exception if the last $em->flush(); stumbles on to a duplicate entry. I could simply put flush inside the loop, but that makes it slow as hell. I could also do a query inside the loop to check if the word already exists, but that would also slow it down substantially.

Is there any other way to make doctrine skip the unique clashes and continue inserting the rest on flush?

If i put it in to a try, catch it catches the exception, but it doesnt insert any rows.

You could track already processed words by storing those persisted in array. Something like this?

$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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM