Reputation:
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.
Upvotes: 0
Views: 738
Reputation: 20193
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();
Upvotes: 1