現象
あるファイルを修正したときのことです。モデル->saveメソッドだけを呼んでいて、モデル->createメソッドを呼んでいませんでした。
修正前
$this->Fuga->save($data);
Code language: plaintext (plaintext)
これまで問題はありませんでしたが、明示的に、モデル->createメソッドを呼んだほうがいいよねと思って、呼ぶようにしました。
修正後
$this->Fuga->create();
$this->Fuga->save($data);
Code language: plaintext (plaintext)
すると、MySQLデータベースを確認すると、createdが 0000-00-00 00:00:00 になってしまいました!
phpMyAdminのスクショ
なぜー?😱
原因
モデル->createメソッドの引数を省略すると、モデル->data配列を全カラムのデフォルト値で埋めます。
モデル->data配列を空配列にしないんですね。
テーブルの created のデフォルト値が、CURRENT_TIMESTAMP なら、
モデル->create();
の結果は、
モデル->data['モデル']['created'] = 'CURRENT_TIMESTAMP';
Code language: plaintext (plaintext)
テーブルの created のデフォルト値が、'0000-00-00 00:00:00' なら、
モデル->create();
の結果は、
モデル->data['モデル']['created'] = '0000-00-00 00:00:00';
Code language: plaintext (plaintext)
モデル->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を設定していれば、そもそも問題ありません。
$data = [
'created' => '2021-07-31 17:45:18',
'name' => 'hoge',
];
モデル->create(false);
モデル->save($data);
Code language: plaintext (plaintext)
$dataでcreatedを未設定のときは、CakePHP 1.3がよろしくやってくれます。
$data = [
'name' => 'hoge',
];
モデル->create(false);
モデル->save($data);
Code language: plaintext (plaintext)
CakePHP 1.3の話しだからね