2016-04-11 3 views
0

Как обновить поле со значением другого поля? Например, я хочу, чтобы обновить поле updated_at со значением поля created_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 представляет Монго курсор, который будет получать документы, как вы итерацию. Вы можете установить eagerCursor на номер true, если вы хотите получить все документы из коллекции сразу.

Вариант № 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 функция, так что вы можете вставить больше логики там, если вам нужно больше контроля над тем, что вы обновляете.

Смежные вопросы