2016-04-11 8 views
0

フィールドを他のフィールドの値で更新するにはどうすればよいですか? 例えば、私は(それがフィールドをクローニングようなものだ)フィールドのcreated_atの値を持つフィールドupdated_atのを更新するフィールドを他のフィールドの値で更新する

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

おかげ

+0

多分、集合体で?? – Fran

答えて

0

オプション#1希望:アプリケーション側更新

をDoctrine ODMを使用する場合の最も簡単なアプローチは、アプリケーション側で更新を実行することです。したがって、更新したいオブジェクトをすべて取り出し、必要な調整を行い、それらをフラッシュします。

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

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

$db->flush(); 

$servicesあなたが反復として文書をフェッチしますモンゴカーソルを表します。一度にコレクションからすべての文書をフェッチする場合は、eagerCursortrueに設定することができます。

オプション#2:データベース側の更新

また、データベース自体に直接更新を実行することができます。ただし、クエリビルダがこの機能をサポートしていないため、クエリを自分で作成する必要があります。

// 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}} 
     ); 
    }); 
'); 

forEachで使用される機能は、普通のjavascript関数であるので、あなたは更新するものをより詳細に制御する必要がある場合、あなたはそこにいくつかのより多くのロジックを挿入することができます。

関連する問題