皆さんはCakePHPでデータベースのカラムなどを追加したり、削除しようとして、原因不明なエラーが出たことはありませんか?
Formヘルパーとマイグレーションファイルを使ってデータベースを更新していたら遭遇した問題を、備忘録として書き記しておこうと思います。
動作環境
CakePHP 3.10
PHP 8.3.4
先に結論
急いでいる方向けに、先に何をしたか書きます。
bin/cake migrations migrate
をする前に
bin/cake cache clear_all
で、CakePHPのキャッシュ削除をする
原因
中身更新前のマイグレーションファイルの内容がキャッシュに残っており、それを参照してCakePHPがデータベースにsave()
しようとしていたようです。
起こるまでの経緯
↓↓↓興味がある方は、どうぞ↓↓↓
出てくる関数名などはフィクションです。
第一話 初動
最初の仕様でデータベースとテーブルを作成し、bin/cake bake migration Hoge
でマイグレーションファイルを作り、bin/cake migrations migrate
で正しく中身を更新、値も入力ページやseedファイルから保存できました。
第二話 変更
その後、保存する値が増えたり減ったりと、仕様が変わりました。
その仕様に伴い、上で作成済のマイグレーションファイルの中身を変更し、再度bin/cake migrations migrate
をし、データベースの内容更新が問題なく終わりました。seedファイルでの初期値保存も、上手く行きました。
第三話 異変
よし!次は入力ページから新しく内容を保存しよう!
すると
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'hoge' in 'field list'
消したはずのカラムが見当たらないとエラーメッセージ。
エラーメッセージをコピペして検索して出てきた内容を試しても、どれも意味がなく…。
そりゃ検索して出てきた内容はどれも「カラム名や関数名合ってる?」といった内容なので、「無いはずの物を見当たらない!」と言われている場合の対処法ではなかったので、当たり前。
マイグレーションファイルで値の内容は更新できる様子だったので、仕方なくもう一度hoge
というカラムを追加し、初期値をnull
にして値を更新させず、放置していました。
第四話 錯綜
不必要なカラムは、null
にして放置すれば最悪なんとかなりました。
問題は、新たに追加したカラムが保存されないことです。
追加したカラムに入力ページから値を保存させようとすると、
SQLSTATE[HY000]: General error: 1364 Field 'fuga' doesn't have a default value
というエラーメッセージが。
デフォルトの値が無いと書かれています。
確かに、fuga
はnull
を許容せず、デフォルトもnull
でした。このエラーメッセージが出るのも頷けます。
問題は、入れた値が入らない点です。
実験的にデフォルト値を設定すると、何度入力ページから保存しても、そのデフォルト値が入ってきています。
第五話 整理
現状を整理してみようと思います。
- 消したはずのカラムが保存されようとしている
- データベース内を確認しても、消したカラムは見当たらない
- 新たに追加したカラムがきちんと保存されない
-
seed
ファイル経由では、新たなカラムも正しく保存されている
つまり、データベースには問題はないが、CakePHPから保存しようとした値が、正しく保存されないということです。
第六話 解明
CakePHPだけがおかしいなら、CakePHPを元に戻せばいいわけです。
そう、つまりはキャッシュの削除です。
bin/cake migrations rollback
bin/cake cache clear_all
bin/cake migrations migrate
マイグレーションファイルを落とし、キャッシュ削除してから再度実行した結果、上手くいきました。
思わぬところで一日使ってしまいました。
最後に
自分自身もまだ社会人なりたてで、色んなところで詰まってQiitaの記事を漁ったり、コードの書き方を忘れて検索することばかりです。
お互い、頑張りましょう。(何様)
同じような状況で詰まっている人の助けになれたのなら、幸いです。