У меня есть две таблицы: статьи и электронные письма. Таблица электронных писем будет содержать электронные письма, связанные с конкретными статьями, например:
id | article_id | email
1 | 1 | [email protected]
2 | 1 | [email protected]
3 | 2 | [email protected]
4 | 2 | [email protected]
Так далее....
Существует связь между article_id и идентификатором из таблицы article.
В моей сущности у меня есть этот код:
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;
}
В моем контроллере я делаю несколько тестов, в которых я сохраняю или не сохраняю некоторые объекты. В конце я делаю флеш
$em->flush();
И странное поведение заключается в том, что в моей таблице электронной почты данные дублируются, как только я делаю сброс. При тестировании менеджера сущностей с помощью
$em->getUnitOfWork()->getScheduledEntityInsertions()
Я получаю пустой массив.
Есть идеи, почему? Большое спасибо.
РЕДАКТИРОВАТЬ:
Вот тест:
$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" );
$em->clear();
отовсюду? Также почему вы просто не делаете один запросupdate
, примерUPDATE Acme\DemoBundle\Entity\Articles p SET p.bMailToMatch = 0 WHERE p.emails_rel IS EMPTY
- person Alexey B.   schedule 24.12.2013if (($i % 3) == 0) {
Почему вы хотите сбрасывать и очищать только каждую третью итерацию? - person Markus Kottländer   schedule 26.12.2013$updated_article
у вас уже есть$art
, эта логика в дополнение к сбросу каждыеi%3==0
может вызвать некоторые «неожиданные ' поведение. - person Onema   schedule 28.12.2013clear
отсоединять уже обработанные статьи от менеджера сущностей после каждого сброса. Clear просто удаляет ссылки из Doctrine ORM на ваши сущности, но у вас все еще есть объекты в массиве. - person Guillermo Gutiérrez   schedule 31.12.2013