2017-01-17 4 views
2

Ich würde gerne wissen, ob es eine Möglichkeit gibt, Werte von Entitäten, die bereits aus der Datenbank abgerufen wurden, nach einem benutzerdefinierten Update zu aktualisieren.Doctrine 2 Aktualisieren von Entitäten nach dem Update

Ein Beispiel

<?php 

/** 
* Element 
* 
* @ORM\Table(name="table_element") 
*/ 
class Element{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
     private $id 

    /** 
    * 
    * @var string 
    * 
    * @ORM\Column(name="element_name", type="string", length=255) 
    */ 
     private $name 

     public function setName($name){ 
      $this->name = $name; 
     } 

     public function getName(){ 
      return $this->name; 
     } 

     public function getId(){ 
      return $this->id; 
     } 
} 

// Inside Controller 

    $em = $this->getDoctrine()->getManager(); 

    $element = $em->getRepository('Element')->find(1); 

    // This prints "Test 1" 
    echo $element->getName(); 

    $qb = $em->createQueryBuilder(); 

    $qb->update('Element', 'E') 
     ->set('E.name', 'New Test Name') 
     ->where('E.id = :id') 
     ->setParameter('id', $element->getId()) ; 

    $qb->getQuery()->execute(); 

    // This still prints "Test 1", i need to print "New Test Name" without using again a select 
    // Something like $em->refreshManagedEntities(); 
    echo $element->getName(); 

I need "Neuer Testnamen" zu drucken, ohne erneut eine Auswahl, so etwas wie $ Ausführungs> persistieren ($ element); $ em-> refreshAllManagedEntities();

Gibt es einen Weg?

P.S. Ich kann benutzerdefinierte Abfragen nicht vermeiden, dies ist ein Beispiel dafür, was ich tun muss.

Antwort

4

Hierzu sollten Sie Rückfragen vermeiden und die Einheit-Manager verwenden:

$qb = $em->createQueryBuilder(); 

$element = $em->getRepository('Element')->find(1); 

// Prints "Test 1" 
echo $element->getName(); 

$element->setName('New Test Name'); 
$em->persist($element); 
$em->flush(); 

// Prints "New Test Name" 
echo $element->getName(); 

Wenn Sie mit Abfragen ausführen, oder wenn das Unternehmen Veränderungen außerhalb Ihres Skript fertig ist, sollten Sie refresh

$em->refresh($entity); 
verwenden
+0

Ok, ich weiß, aber ich kann nicht in diesem Fall Abfragen vermeiden, ich habe gerade ein Beispiel dafür, was ich tun muss. –

+0

Vielen Dank! Ich bin so ein Noob ... –

+0

Sag nicht, dass wir alle lernen! Happy to help – goto

Verwandte Themen