2016-03-16 5 views
6

Ich habe mehrere Schleifen wie:Doktrin updaten Einheit in Schleife, persistent oder Flush?

$bets = $this->em->getRepository('AppBundle:Bet')->getBetsForMatch($match_id); 

    foreach ($bets as $key => $bet) { 
     $devices = $this->em->getRepository('AppBundle:Device')->findBy(array('user' => $bets->getUser())); 

     foreach ($devices as $key => $device) { 
      //HERE I SEND A PUSH NOTIFICATION 

      if($this->rms_push->send($message)){ 
       $device->getUser()->setBadge($device->getUser()->getBadge() + 1); 
       $this->em->flush(); 
      } 
     } 
    } 

So, erhalte ich alle Wetten für ein Spiel, für jede Wette ich alle Geräte für den Benutzer gespeichert werden, und danach muss ich mit meinem Benutzer aktualisieren: $device->getUser()->setBadge($device->getUser()->getBadge() + 1);

Für jetzt spüle ich jedes Mal, aber ich denke, es gibt einen besseren Weg, Ideen?

Antwort

5

Sie benötigen nur einen Flush, aus der Schleife:

foreach ($bets as $key => $bet) { 
    $devices = $this->em->getRepository('AppBundle:Device')->findBy(array('user' => $bets->getUser())); 

    foreach ($devices as $key => $device) { 
     //HERE I SEND A PUSH NOTIFICATION 

     if($this->rms_push->send($message)){ 
      $device->getUser()->setBadge($device->getUser()->getBadge() + 1); 
     } 
    } 
} 

$this->em->flush(); 

Aufruf $this->_em->persist($obj) einen neuen Eintrag erstellen beinhaltet.

Wenn Sie erstellen oder aktualisieren müssen abhängig von dem Eintrag existiert oder nicht, schauen Sie at EntityManager::merge.

Um die Speichernutzung für eine große Anzahl von Einträgen zu erhalten, sehen Sie sich batch processing an.

Hinweis SensioLabs insight (PHP-Quellcodequalitätsanalyse) löst eine Warnung aus, wenn Ihr Code innerhalb einer Schleife EntityManager::flush aufruft.

+0

Also, wenn ich eine neue Entität in meiner Schleife erstellen, muss ich persistieren, aber so sind alle aktualisierten Entitäten im Speicher? Wenn ich zweimal den gleichen Benutzer aktualisiere, ist das ok? –

+0

Richtig, alles ist in Erinnerung. Ich habe gerade einen Link am Ende meiner Antwort hinzugefügt, um eine große Menge an Daten zu verarbeiten, und wenn Sie den Entitymanager erstellen müssen, wenn er existiert, verwenden Sie stattdessen 'EntityManager :: merge', siehe auch den Link in meiner Antwort. Sensio Labs Insight (Symfony Code Quality Analyzer) löst eine Warnung aus, wenn Sie innerhalb einer Schleife spülen. – chalasr