[CakePHP 1.3] MySQLのcreatedカラムが 0000-00-00 00:00:00 になってしまう

現象

あるファイルを修正したときのことです。モデル->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モデル->createcreatedカラムの結果判定
1$data = [
'created' => '2021-07-01 00:00:00',
]
モデル->create(false)2021-07-01 00:00:00正常
2$data = [
'created' => '2021-07-01 00:00:00',
]
モデル->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モデル->createcreatedカラムの結果判定
1$data = [
'created' => '2021-07-01 00:00:00',
]
モデル->create(false)2021-07-01 00:00:00正常
2$data = [
'created' => '2021-07-01 00:00:00',
]
モデル->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モデル->createcreatedカラムの結果判定
1$data = [
'created' => '2021-07-01 00:00:00',
]
モデル->create(false)2021-07-01 00:00:00正常
2$data = [
'created' => '2021-07-01 00:00:00',
]
モデル->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の話しだからね

タイトルとURLをコピーしました