CakePHPのモデルは、created(作成日)、modified(更新日)といったフィールドがテーブル定義に存在すると、これらのフィールド値をわざわざ設定しなくとも自動的に設定してくれます。次のように、これらのフィールドにデフォルト値が無いようなテーブル定義であればです。
CREATE TABLE `posts` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(50) NOT NULL, `body` text NOT NULL, `created` timestamp NULL DEFAULT NULL, `modified` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) );
何らかの理由で(このテーブルを更新する他のシステムがもともと存在するなど)、次のように、これらのフィールドにデフォルト値を設定して置かなければならないとしましょう。
CREATE TABLE `posts` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(50) NOT NULL, `body` text NOT NULL, `created` timestamp NOT NULL DEFAULT 0, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) );
上記では、更新日(modified)にデフォルト値として現在日時、更新時にも現在日時を自動的に設定したいので、作成日(created)のデフォルト値を0(’0000-00-00 00:00:00’)としています。ちなみにMySQLでは、TIMESTAMPに現在日時をデフォルト値として設定できるのは1テーブルに1つだけです(他のTIMESTAMPフィールドのデフォルト値は’0000-00-00 00:00:00’とみなされます)。
ところが、このままではCakePHPのモデルからレコードを新規登録した場合、createdの値は’0000-00-00 00:00:00’となってしまいます。これを手っ取り早くやっつけたいのであれば、モデルで次のようにします。
class Post extends AppModel { /* 中略 */ public function beforeSave($options = []) { if (!$this->exists()) { $this->data['Post']['created'] = date('Y-m-d H:i:s'); } return true; } }
効率の良いやり方とは言えないでしょうが...。
ピンバック: cakePHP Tips