マイグレーションファイルで、nullable()
指定してるのに「初期値が無いよ!」と怒られてしまいました。つまりnull
を入れようとしたら例外が発生しています。
こんな指定です。
$table->foreignId('hoge_id')->constrained('hoges')->nullable()->onDelete('restrict');
何度見ても、nullable()
はあります。対象のマイグレーションファイルを間違えている訳でもありません。
どうやらnullable()
指定が効いていないようです。
結論
nullable()はconstrained()の前に書くべし。後ではだめです。
$table->foreignId('hoge_id')->nullable()->constrained('hoges')->onDelete('restrict');
これで解決です。
残念なことに、後に書いてもマイグレーション時にエラーにはなりません。今回のように、ただnullable()
が効かなくなるだけ。
そのため間違いに気づきにくいので気をつけましょう。
蛇足
問題が解決できない時点では、ChatGPTに聞いても「問題無い」と言われます(最近はGoogleよりもAIで解決できることもしばしば)。
急いでたので適当にnullable()指定の位置をずらしてみたところ動きます。理由は不明ですが、いったん問題解決ということ追究しませんでした。
しかし気持ちが悪いので時間がとれた際にマニュアルを見ると、以下の様に記されています。
Any additional column modifiers must be called before the constrained method:
Database: Migrations – Laravel 10.x – The PHP Framework For Web Artisans
めっちゃ書いてあるやん……
マニュアルをよく読んでいない自分が悪かったです。でも、なんならエラーにでもしてくれた方がありがたいなと思いました。
いままではnullable()
の位置を気にしていませんでした。たまたまconstrained()
の前に書いていたのでしょう。こんな落とし穴があることに気がつけて良かったです。
まとめ
結論→nullable()
はconstrained()
の前に設置すること。そしてマニュアルを読もう、です。
焦ったり時間がないと対症療法でその場をなんとかしがちですが、急がば回れ。マニュアルを見ることは当たり前ですが重要ですね。
コメント