この記事でLaravelのリレーションで外部キーにnullを許可する以下の2つの方法をご紹介します。
Laravel >= 7.x を使っている場合はforeignId()を使用した方法をおすすめします。
外部キーの設定が1行でかけてコードがスッキリします。
バージョンに関係ない共通の書き方
Laravelはバージョンに関係なく以下のようにnullable()を追加することでリレーションの外部キーにnullを許可することができます。
Schema::table('posts', function (Blueprint $table) {
// Laravel <= 5.5
// $table->integer('user_id')->unsigned()->nullable();
// Laravel >= 5.6
$table->unsignedBigInteger('user_id')->nullable();
$table->foreign('user_id')->references('id')->on('users');
});この書き方だと2行になってしまい、長いです。
そのため、Laravel >= 7.0 を使っている場合はforeignId()を使用して1行で書くことができます。
Laravel >= 7.0 以上を使っている場合はforeignId()を使える
Laravel 7.xや8.xを使っている場合はforeignId()を使って一行で外部キーを作ることができます。foreignId()を使って外部キーを作る場合は以下のようにします。
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained('users');
});nullable()で外部キーにnullを許可する場合はforeignId()の直後に入れます。foreignId()を使用した場合、nullable()を入れる位置に注意してください。
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')
->nullable() // ここでnullを許可
->constrained('users');
});以下のようにnullable()をconstrained()の後ろに入れるとnullは許可されません。
だたし、onUpdate()やonDelete()はconstrained()のあとに書くとことができます。
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')
->constrained('users')
->nullable(); // ここでnullable()を入れてもnullが許可されない
});まとめ
Laravelではリレーションの外部キーを追加する方法は2つあります。
バージョンに関係ない共通の書き方は以下の通りです。
Schema::table('posts', function (Blueprint $table) {
// Laravel <= 5.5
// $table->integer('user_id')->unsigned()->nullable();
// Laravel >= 5.6
$table->unsignedBigInteger('user_id')->nullable();
$table->foreign('user_id')->references('id')->on('users');
});Laravel >= 7.xを使っている場合はforeignId()を使うことができます。
foreignId()を使うと外部キーの設定が1行でかけます。
しかし、nullable()を追加する位置に注意してください。
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')
->nullable() // ここでnullを許可
->constrained('users');
});https://laravel.com/docs/8.x/migrations#foreign-key-constraints









コメント