Laravelマイグレーション:既存の列をNULL許容から非NULLに変更する方法
Laravel マイグレーションで列を非 NULL にする
前提条件
このチュートリアルを実行する前に、以下の条件を満たしていることを確認してください。
- Laravel がインストールされている
- 対象となるデータベーステーブルが存在する
- マイグレーションファイルの作成方法を知っている
手順
- 既存のマイグレーションファイルを開く
対象となるテーブルの構造を変更するマイグレーションファイルを開きます。ファイル名は、通常 create_table_name_table.php
のような形式になります。
change()
メソッドを使用して列を変更する
up()
メソッド内に、change()
メソッドを使用して列を修正します。このメソッドには、以下の引数が必要です。
- テーブル名: 変更するテーブル名
- カラム名: 変更する列名
- 変更後の型: 列の新しいデータ型
- オプション引数: デフォルト値、制約など
以下の例では、users
テーブルの email
列を NULL 許容から非 NULL に変更します。
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->change();
});
}
- 列の型を変更する場合は、
change()
メソッドの第二引数に新しい型を指定します。 - デフォルト値を設定する場合は、
default()
メソッドを使用します。 - 列に制約を追加する場合は、
unique()
,nullable()
,index()
などのメソッドを使用します。
- マイグレーションを実行する
以下のコマンドを実行して、マイグレーションをデータベースに適用します。
php artisan migrate
注意事項
- 列を非 NULL に変更する前に、既存のデータに NULL 値が含まれていないことを確認してください。
- 列を非 NULL に変更すると、その列に値が入力されていないレコードがエラーになる可能性があります。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class MakeEmailColumnNonnull extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable()->change();
});
}
}
説明
このコードは以下の処理を行います。
Schema::table('users', function (Blueprint $table) { ... })
で、users
テーブルに対する変更を定義します。$table->string('email')->change();
で、email
列をstring
型に変更します。- 変更を保存するために
up()
メソッドを終了します。 down()
メソッドは、マイグレーションをロールバックする場合に使用されます。この例では、email
列を元の NULL 許容状態に戻します。
- このコードは Laravel 9.x 以降で使用できます。
alterColumn()
メソッドを使用して、列の型と制約を変更することができます。この方法は、change()
メソッドよりも新しい方法です。
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->alterColumn('email', 'string')->nullable(false);
});
}
マイグレーションファイルを2つ作成する
マイグレーションファイルを2つ作成し、1つ目で列を NULL 許容に変更し、2つ目で列を非 NULL に変更する方法もあります。
この方法の利点は、変更履歴を明確に追跡できることです。
例
1つ目のマイグレーションファイル (MakeEmailColumnNullable.php)
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class MakeEmailColumnNullable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable()->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->change();
});
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class MakeEmailColumnNonnull extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable()->change();
});
}
}
Tinker を使用する
Tinker を使用して、データベース操作をインタラクティブに行うこともできます。ただし、この方法は本番環境では推奨されません。
以下の例では、Tinkerを使用して users
テーブルの email
列を非 NULL に変更します。
Artisan tinker
DB::table('users')->alterColumn('email', 'string', ['nullable' => false]);
php sql database-migration