CakePHPでデータベースに対して insert や update を行う際、PHPのメソッドである date() メソッドは使用しないほうが良い。
代案
CakePHPにおいてDBに現在時刻を保存する場合はDboSource::expression('NOW()')
を使うと良い。
理由
2つの表す時刻は次の通りである。
記述 | 表す時刻 |
---|---|
date('Y-m-d H:i:s') |
PHPサーバ時刻 |
DboSource::expression('NOW()') |
DBサーバ時刻 SQLで NOW() を直ガキした場合やCURRENT_TIMESTAMP と記述した場合と同じ。 |
ConnectionManager::getDataSource('default')->expression('NOW()') |
DboSource::expression('NOW()') で、Non-static method DboSource::expression() should not be ... と言われるようならこっち。 |
ということである。
つまりは、前者はDBサーバとのタイムゾーンの整合性が保証されないのに対し、後者はそこが保証されるということ。
MySQLではDEFAULT CURRENT_TIMESTAMP
, ON UPDATE CURRENT_TIMESTAMP
制約は1テーブルにつき1カラムにしか設定できないなどの制約があり、データ更新時に手動で時刻を与えてやらなければならない場合がある。
この時先の制約を付けたカラムとの時刻整合性を保つためにはDboSource::expression('NOW()')
を用いた方が良いということ。