Symfony2 und Doctrine: OneToMany-Beziehung dupliziert data in der Tabelle

Ich habe zwei Tabellen: Artikel und E-Mails. Die E-Mail-Tabelle enthält E-Mails, die sich auf bestimmte Artikel beziehen, zum Beispiel:

id | article_id | email 1 | 1 | test@etest.com 2 | 1 | test2@test.com 3 | 2 | test@etest.com 4 | 2 | test3@test.com 

Etc….

Es gibt eine Beziehung zwischen article_id und der ID aus der Artikeltabelle.

In meiner Entität habe ich diesen Code:

 class Articles { .... /** * @ORM\OneToMany(targetEntity="\Acme\DemoBundle\Entity\Emails", mappedBy="articles") */ private $emails_rel; ... } class Emails { /** * @ORM\ManyToOne(targetEntity="\Acme\DemoBundle\Entity\Articles", inversedBy="emails_rel", cascade={"all"}) * @ORM\JoinColumn(name="article_id", referencedColumnName="id") **/ private $articles; } 

In meinem Controller mache ich einige Tests, bei denen ich einige Entitäten beibehalten werde. Am Ende mache ich einen Flush

 $em->flush(); 

Und das seltsame Verhalten ist, dass in meiner Tabelle E-Mails die data dupliziert werden, sobald ich den Flush mache. Beim Testen des Entity Managers mit

 $em->getUnitOfWork()->getScheduledEntityInsertions() 

Ich bekomme ein leeres Array.

Irgendeine Idee warum? Vielen Dank.

BEARBEITEN:

Hier ist der Test:

 $articl = new Articles(); $articl = $em->createQuery("SELECT p FROM Acme\DemoBundle\Entity\Articles p WHERE p.bMailToMatch = 1")->getResult(); $nb = count($articl); // BECAUSE I WILL WORK WITH A LOTS OF ENTRIES - PREVENT MEMORY OVERFLOW $em->clear(); if(isset( $articl )) { foreach($articl as $i => $art) { $array_emails = null; $art_emails = $art->getEmailsRel(); foreach ($art_emails as $e) { $array_emails[] = $e->getEmail(); } $art_id = $art->getId (); echo "\n\n---------- $i ----------\n " . $art->getDoi (); // TAKES ARTICLE WITH ZERO EMAIL if (!isset($array_emails) ) { $updated_article = $em->getRepository('AcmeDemoBundle:Articles')->findOneBy(array( 'id' => ($art_id) )) ; // Because of the clearing of the entity manager echo"\n\n$art_id Article DOI \n".$updated_article->getDoi(); echo "\n==>Put the BMailToMatch's flag to 0"; $updated_article->setBMailToMatch(0); $em->persist($updated_article); } else { echo " ==> ok\n"; } if (($i % 3) == 0) { $em->flush(); $em->clear(); } } $em->flush(); $em->clear(); } return new Response ( "\n\nFinished!!\n" ); 

Solutions Collecting From Web of "Symfony2 und Doctrine: OneToMany-Beziehung dupliziert data in der Tabelle"

Ich habe dein Problem nicht bemerkt, bevor ich es reproduziert habe, aber jetzt ist es offensichtlich. Ihr Problem kommt von der Verwendung der klaren Methode. Wenn du deinen Entity Manager löschst, vergisst er ihre Existenz und behält sie als neue Entitäten bei.

Wenn Sie ein performancesproblem haben, können Sie die Anzahl der Elemente begrenzen, mit denen Sie arbeiten, und dies rekursiv durchführen, bis Sie fertig sind.

Ich hoffe es hat dir geholfen;)

Viel Glück

Prost

Wenn ich das richtig lese, wäre eine vereinfachte Version des Codes wie folgt:

 $articles_with_mail_to_match_true = $em->createQuery("SELECT p FROM Acme\DemoBundle\Entity\Articles p WHERE p.bMailToMatch = 1")->getResult(); foreach($articles_with_mail_to_match_true as $i => $article_with_mail_to_match_true) { if ( count($article_with_mail_to_match_true->getEmailsArray()) < 1 ) { $article_copy_object = $em->getRepository('AcmeDemoBundle:Articles')->findOneBy(array( 'id' => ($article_with_mail_to_match_true->getId()) )) ; $article_copy_object->setBMailToMatch(0); $em->persist($article_copy_object); } if (($i % 3) == 0) { $em->flush(); } } $em->flush(); 

Es scheint, dass das einzige, was Sie persistieren, das $ article_copy_object ist, nachdem Sie den einen Wert geändert haben. Wenn das der Fall ist, dann entweder A. es ist etwas falsch in Ihrer Entität, das wir in diesem Codebeispiel nicht sehen können oder B. es passiert woanders und nicht während dieser Operation.