現象
あるファイルを修正したときのことです。モデル->saveメソッドだけを呼んでいて、モデル->createメソッドを呼んでいませんでした。
修正前
Code language: plaintext (plaintext)$this->Fuga->save($data);
これまで問題はありませんでしたが、明示的に、モデル->createメソッドを呼んだほうがいいよねと思って、呼ぶようにしました。
修正後
Code language: plaintext (plaintext)$this->Fuga->create(); $this->Fuga->save($data);
すると、MySQLデータベースを確認すると、createdが 0000-00-00 00:00:00 になってしまいました!
phpMyAdminのスクショ


なぜー?😱
原因
モデル->createメソッドの引数を省略すると、モデル->data配列を全カラムのデフォルト値で埋めます。
モデル->data配列を空配列にしないんですね。
テーブルの created のデフォルト値が、CURRENT_TIMESTAMP なら、
Code language: plaintext (plaintext)モデル->create(); の結果は、 モデル->data['モデル']['created'] = 'CURRENT_TIMESTAMP';
テーブルの created のデフォルト値が、'0000-00-00 00:00:00' なら、
Code language: plaintext (plaintext)モデル->create(); の結果は、 モデル->data['モデル']['created'] = '0000-00-00 00:00:00';

モデル->data = [] にはならないんだ 😫
それまでの状態をクリアするために、モデル->data を空配列にすることが目的なら、引数にfalseを渡して、モデル->create(false)と呼びます。
実験
createdカラムのデフォルト値が「CURRENT_TIMESTAMP」
# | $data | モデル->create | createdカラムの結果 | 判定 |
---|---|---|---|---|
1 | $data = [ | モデル->create(false) | 2021-07-01 00:00:00 | 正常 |
2 | $data = [ | モデル->create() | 2021-07-01 00:00:00 | 正常 |
3 | $data = []; | モデル->create(false) | 2021-07-31 17:36:12 (実行した時点の日時) | 正常 |
4 | $data = []; | モデル->create() | 0000-00-00 00:00:00 | 不具合 |
$dataでcreated未設定、createメソッドの引数省略すると、createdカラムは'0000-00-00 00:00:00' になってしまいました。
createdカラムのデフォルト値が「0000-00-00 00:00:00」
# | $data | モデル->create | createdカラムの結果 | 判定 |
---|---|---|---|---|
1 | $data = [ | モデル->create(false) | 2021-07-01 00:00:00 | 正常 |
2 | $data = [ | モデル->create() | 2021-07-01 00:00:00 | 正常 |
3 | $data = []; | モデル->create(false) | 2021-07-31 17:36:12 (実行した時点の日時) | 正常 |
4 | $data = []; | モデル->create() | 0000-00-00 00:00:00 | 不具合 |
$dataでcreated未設定、createメソッドの引数省略すると、createdカラムは'0000-00-00 00:00:00' になってしまいました。
createdカラムのデフォルト値が「なし」
# | $data | モデル->create | createdカラムの結果 | 判定 |
---|---|---|---|---|
1 | $data = [ | モデル->create(false) | 2021-07-01 00:00:00 | 正常 |
2 | $data = [ | モデル->create() | 2021-07-01 00:00:00 | 正常 |
3 | $data = []; | モデル->create(false) | 2021-07-31 17:36:12 (実行した時点の日時) | 正常 |
4 | $data = []; | モデル->create() | 2021-07-31 17:36:12 (実行した時点の日時) | 正常 |
どの場合でも、createdカラムは期待したとおりの値になっていました。
対策
それまでの状態をクリアするために、モデル->data を空配列にすることが目的で、モデル->createメソッドを呼ぶときには、falseを渡します。
$dataでcreatedを設定していれば、そもそも問題ありません。
Code language: plaintext (plaintext)$data = [ 'created' => '2021-07-31 17:45:18', 'name' => 'hoge', ]; モデル->create(false); モデル->save($data);
$dataでcreatedを未設定のときは、CakePHP 1.3がよろしくやってくれます。
Code language: plaintext (plaintext)$data = [ 'name' => 'hoge', ]; モデル->create(false); モデル->save($data);

CakePHP 1.3の話しだからね