マイグレーションファイルで外部キーにnullable()指定してるのに効かない→場所が悪いです

外部キーにnullable()指定が効かない Laravel
※当サイトはアフィリエイト広告を掲載しています。

マイグレーションファイルで、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
Lara
Lara

めっちゃ書いてあるやん……

マニュアルをよく読んでいない自分が悪かったです。でも、なんならエラーにでもしてくれた方がありがたいなと思いました。

いままではnullable()の位置を気にしていませんでした。たまたまconstrained()の前に書いていたのでしょう。こんな落とし穴があることに気がつけて良かったです。

まとめ

結論→nullable()constrained()の前に設置すること。そしてマニュアルを読もう、です。

焦ったり時間がないと対症療法でその場をなんとかしがちですが、急がば回れ。マニュアルを見ることは当たり前ですが重要ですね。

コメント

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