2016-04-11 14 views
0

Wie kann ich ein Feld mit dem Wert eines anderen Feldes aktualisieren? Zum Beispiel möchte ich mit dem Wert des Feldes created_at das Feld aktualisieren updated_at (es ist wie das Klonen Felder)ein Feld mit dem Wert eines anderen Felds aktualisieren

$dm->createQueryBuilder('MyBundle:MyService') 
      ->update() 
      ->multiple(true) 
      ->field('updated_at')->set(CREATED_AT_ATRIBUTE) 
      ->getQuery() 
      ->execute(); 

Dank

+0

vielleicht mit einem Aggregat ?? – Fran

Antwort

0

Option # 1: Anwendung Seite Update

Die Der einfachste Ansatz bei der Verwendung von Doctrine ODM besteht darin, die Aktualisierung auf der Anwendungsseite durchzuführen. Sie holen also alle Objekte, die Sie aktualisieren möchten, nehmen die notwendigen Anpassungen vor und löschen sie.

$services = $dm->createQueryBuilder('MyBundle:MyService') 
    ->getQuery() 
    ->execute(); 

foreach ($services as $service) { 
    $service->setUpdatedAt($service->getCreatedAt()); 
} 

$db->flush(); 

$services stellt den Mongo Cursor, der die Dokumente holen, wie Sie durchlaufen. Sie können eagerCursor auf true setzen, wenn Sie alle Dokumente gleichzeitig aus der Sammlung abrufen möchten.

Option # 2: Datenbank Seite Update

Sie auch das Update direkt auf die Datenbank selbst durchführen kann. Dazu müssen Sie die Abfrage jedoch selbst erstellen, da der Abfrage-Generator diese Funktionalität nicht unterstützt.

// Get MongoDB instance from DocumentManager 
$mongo = $dm->getDocumentDatabase('Fully/Qualified/Class/Name') 
    ->getMongoDB(); 

// Iterate over the collection and update each document 
$mongo->execute(' 
    db.MyServiceCollection.find().forEach(function (item) { 
     db.MyServiceCollection.update(
      {_id: item._id}, 
      {$set: {updated_at: item.created_at}} 
     ); 
    }); 
'); 

Die Funktion in forEach verwendet wird, ist nur eine ganz normale JavaScript-Funktion, so dass Sie dort etwas mehr Logik einsetzen können, wenn Sie mehr Kontrolle über was müssen Sie aktualisieren.