[EC-CUBE3]オブジェクトのDateTimeの値を変更する

既存のオブジェクトの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になるためオブジェクトのセッターで扱えるようになる。

参考

Doctrine modified DateTime is not persisted [duplicate]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

12 + 14 =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください