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

この記事で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');
});

https://laravel.com/docs/8.x/migrations#foreign-key-constraints

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

エンジニアを目指す方必見!おすすめプログラミングスクール

最短でエンジニアになるには、いかに効率よく学習するかが重要です。モチベーションを維持しながら最短でエンジニアを目指すならプログラミングスクールを利用するのもおすすめです。

コメント

コメントする

目次