既存のオブジェクトのDatetime型の値を変更したいときに下記の操作を行った。
$end_date = $object->getEndDate();
$end_date->modify('+1 day');
$object
->setEndDate($end_date)
;
$app['orm.em']->persist($object);
$app['orm.em']->flush();
このやり方だとDBカラムの’end_date’の値は変更されない。
オブジェクトをdumpして値を確認すると、’end_date’の値は変更されているがDBレコードへ反映されなかった。
調べると既に存在しているDateTimeオブジェクトの値を変更して使用することができない様子。
symfonyのdumpコマンドを使用するとDateTimeオブジェクトのID(?)が表示される(下記の「#」以降の数字の値)が、別のIDが振られているDateTimeオブジェクトでないとDBレコードの値を更新しない。
Entity\Object {#6368
-id: 1
-end_date: DateTime {#7295
+"date": "2019-01-01 00:00:00.000000"
+"timezone_type": 3
+"timezone": "Asia/Tokyo"
}
そのためオブジェクトから取得した値を元に、新規にDateTimeオブジェクトを定義してその変数をセッターに渡してあげると正常にDBへの反映が行われた。
$end_date = $object->getEndDate();
$new_date = new \DateTime($end_date->format('Y-m-d H:i:s'));
$new_date->modify('+1 day');
$object
->setEndDate($new_date)
;
$app['orm.em']->persist($object);
$app['orm.em']->flush();
また既存のオブジェクトをcloneするというやり方もあるようだ。
この場合はオブジェクトをcloneすると、保持しているDateTimeオブジェクトも異なるIDになるためオブジェクトのセッターで扱えるようになる。