Laravelでリレーションの外部キーにnullを許可する

Laravel
スポンサーリンク
language

この記事でLaravelのリレーションで外部キーにnullを許可する以下の2つの方法をご紹介します。

  • バージョンに関係ない共通の書き方
  • Laravel >= 7.x でforeignId()を使う方法

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');
});
Database: Migrations - Laravel - The PHP Framework For Web Artisans
タイトルとURLをコピーしました