この記事で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
コメント