メインコンテンツまでスキップ

データベース: マイグレーション

はじめに

マイグレーションは、データベースのためのバージョン管理のようなものであり、チームがアプリケーションのデータベーススキーマ定義を定義して共有できるようにします。ソースコントロールから変更をプルした後にチームメイトに手動でローカルデータベーススキーマに列を追加するように指示する必要があったことがある場合、データベースマイグレーションが解決する問題に直面しています。

LaravelのSchema ファサード は、Laravelがサポートするすべてのデータベースシステムでテーブルの作成や操作をサポートするためのデータベースに依存しないサポートを提供します。通常、マイグレーションはこのファサードを使用してデータベースのテーブルやカラムを作成および変更します。

マイグレーションの生成

make:migration Artisanコマンド を使用してデータベースマイグレーションを生成することができます。新しいマイグレーションは database/migrations ディレクトリに配置されます。各マイグレーションのファイル名には、Laravelがマイグレーションの順序を決定するためのタイムスタンプが含まれています:

php artisan make:migration create_flights_table

Laravelはマイグレーションの名前を使用して、テーブルの名前やマイグレーションが新しいテーブルを作成するかどうかを推測しようとします。Laravelがマイグレーション名からテーブル名を決定できる場合、Laravelは生成されたマイグレーションファイルに指定されたテーブルを自動的に入力します。それ以外の場合は、マイグレーションファイルでテーブルを手動で指定することができます。

make:migration コマンドを実行する際に --path オプションを使用して生成されるマイグレーションのカスタムパスを指定することができます。指定されたパスは、アプリケーションのベースパスを基準として相対的である必要があります。

注記

マイグレーションスタブは、スタブの公開を使用してカスタマイズすることができます。

マイグレーションのスクワッシュ

アプリケーションを構築するにつれて、時間の経過とともにますます多くのマイグレーションが蓄積されることがあります。これにより、database/migrations ディレクトリが数百ものマイグレーションで肥大化する可能性があります。必要であれば、マイグレーションを1つの SQL ファイルに「スクワッシュ」することができます。開始するには、schema:dump コマンドを実行してください:

php artisan schema:dump

# Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

このコマンドを実行すると、Laravel はアプリケーションの database/schema ディレクトリに「スキーマ」ファイルを書き込みます。スキーマファイルの名前は、使用しているデータベース接続に対応します。これで、データベースをマイグレーションしようとするときに、他に実行されたマイグレーションがない場合、Laravel は最初に使用しているデータベース接続のスキーマファイルの SQL ステートメントを実行します。スキーマファイルの SQL ステートメントを実行した後、Laravel はスキーマダンプに含まれていなかった残りのマイグレーションを実行します。

アプリケーションのテストが、ローカル開発中に通常使用するものとは異なるデータベース接続を使用している場合、テストがデータベースを構築できるように、そのデータベース接続をダンプしていることを確認する必要があります。通常の開発中に使用するデータベース接続をダンプした後に、これを行うことをお勧めします:

php artisan schema:dump
php artisan schema:dump --database=testing --prune

他の新しい開発者がチームに加わったときに、アプリケーションの初期データベース構造を迅速に作成できるように、データベーススキーマファイルをソース管理にコミットする必要があります。

警告

マイグレーションのスクワッシュは、MySQL、PostgreSQL、および SQLite データベースにのみ利用可能であり、データベースのコマンドラインクライアントを利用します。

マイグレーションの構造

マイグレーションクラスには、up メソッドと down メソッドの2つのメソッドが含まれています。up メソッドは、データベースに新しいテーブル、カラム、またはインデックスを追加するために使用され、down メソッドは up メソッドによって実行された操作を逆にするために使用されます。

これらのメソッドのいずれかで、Laravelスキーマビルダーを使用して、表を表現的に作成および変更することができます。Schema ビルダーで使用可能なすべてのメソッドについては、そのドキュメントを参照してください。たとえば、次のマイグレーションは flights テーブルを作成します:

    <?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::drop('flights');
}
};

マイグレーション接続の設定

マイグレーションが、アプリケーションのデフォルトのデータベース接続以外のデータベース接続とやり取りする場合は、マイグレーションの $connection プロパティを設定する必要があります:

    /**
* The database connection that should be used by the migration.
*
* @var string
*/
protected $connection = 'pgsql';

/**
* Run the migrations.
*/
public function up(): void
{
// ...
}

マイグレーションの実行

未解決のすべてのマイグレーションを実行するには、migrate Artisan コマンドを実行します:

php artisan migrate

これまでに実行されたマイグレーションを確認したい場合は、migrate:status Artisan コマンドを使用できます:

php artisan migrate:status

実際に実行されるマイグレーションの SQL ステートメントを確認したい場合は、migrate コマンドに --pretend フラグを指定できます:

php artisan migrate --pretend

マイグレーションの実行を分離する

アプリケーションを複数のサーバーに展開し、マイグレーションを展開プロセスの一部として実行している場合、おそらく2つのサーバーが同時にデータベースをマイグレーションしようとすることは避けたいでしょう。これを避けるために、migrate コマンドを呼び出す際に isolated オプションを使用することができます。

isolated オプションを指定すると、Laravel はアプリケーションのキャッシュドライバーを使用してアトミックロックを取得し、マイグレーションを実行しようとします。そのロックが保持されている間に migrate コマンドを実行しようとする他のすべての試行は実行されません。ただし、コマンドは引き続き成功した終了ステータスコードで終了します。

php artisan migrate --isolated
警告

この機能を利用するには、アプリケーションがデフォルトのキャッシュドライバとして memcachedredisdynamodbdatabasefile、または array キャッシュドライバを使用している必要があります。さらに、すべてのサーバーが同じ中央キャッシュサーバーと通信している必要があります。

本番環境でマイグレーションを強制実行する

一部のマイグレーション操作は破壊的であり、データが失われる可能性があります。これらのコマンドを本番データベースに対して実行することを防ぐために、コマンドが実行される前に確認を求められます。プロンプトなしでコマンドを強制的に実行するには、--force フラグを使用します:

php artisan migrate --force

マイグレーションをロールバックする

最新のマイグレーション操作をロールバックするには、rollback Artisan コマンドを使用できます。このコマンドは、最後の「バッチ」のマイグレーションをロールバックします。これには複数のマイグレーションファイルが含まれる場合があります:

php artisan migrate:rollback

rollback コマンドに step オプションを指定することで、限られた数のマイグレーションをロールバックできます。たとえば、次のコマンドは最後の 5 つのマイグレーションをロールバックします:

php artisan migrate:rollback --step=5

rollback コマンドに batch オプションを指定することで、特定の「バッチ」のマイグレーションをロールバックできます。ここで batch オプションは、アプリケーションの migrations データベーステーブル内のバッチ値に対応します。たとえば、次のコマンドはバッチ 3 のすべてのマイグレーションをロールバックします:

php artisan migrate:rollback --batch=3

マイグレーションを実行せずに実際に実行される SQL ステートメントを表示したい場合は、migrate:rollback コマンドに --pretend フラグを指定できます:

php artisan migrate:rollback --pretend

migrate:reset コマンドは、アプリケーションのすべてのマイグレーションをロールバックします:

php artisan migrate:reset

1 つのコマンドを使用してロールバックとマイグレーション

migrate:refreshコマンドは、すべてのマイグレーションをロールバックしてからmigrateコマンドを実行します。このコマンドは、実質的にデータベース全体を再作成します:

php artisan migrate:refresh

# Refresh the database and run all database seeds...
php artisan migrate:refresh --seed

refreshコマンドにstepオプションを指定することで、限られた数のマイグレーションをロールバックして再マイグレーションすることができます。例えば、以下のコマンドは、最後の5つのマイグレーションをロールバックして再マイグレーションします:

php artisan migrate:refresh --step=5

すべてのテーブルを削除してマイグレーションする

migrate:freshコマンドは、データベースからすべてのテーブルを削除してからmigrateコマンドを実行します:

php artisan migrate:fresh

php artisan migrate:fresh --seed

デフォルトでは、migrate:freshコマンドはデフォルトのデータベース接続からのみテーブルを削除します。ただし、--databaseオプションを使用して、マイグレーションするデータベース接続を指定することができます。データベース接続名は、アプリケーションのdatabase構成ファイルで定義された接続に対応する必要があります:

php artisan migrate:fresh --database=admin
警告

migrate:freshコマンドは、プレフィックスに関係なくすべてのデータベーステーブルを削除します。このコマンドは、他のアプリケーションと共有されているデータベースで開発する際には注意して使用する必要があります。

テーブル

テーブルの作成

新しいデータベーステーブルを作成するには、Schemaファサードのcreateメソッドを使用します。createメソッドは2つの引数を受け入れます。最初の引数はテーブルの名前であり、2番目の引数は新しいテーブルを定義するために使用できるBlueprintオブジェクトを受け取るクロージャです:

    use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email');
$table->timestamps();
});

テーブルを作成する際には、スキーマビルダーのカラムメソッドのいずれかを使用して、テーブルのカラムを定義できます。

テーブル/カラムの存在を判定する

hasTablehasColumnhasIndexメソッドを使用して、テーブル、カラム、またはインデックスの存在を判定できます:

    if (Schema::hasTable('users')) {
// The "users" table exists...
}

if (Schema::hasColumn('users', 'email')) {
// The "users" table exists and has an "email" column...
}

if (Schema::hasIndex('users', ['email'], 'unique')) {
// The "users" table exists and has a unique index on the "email" column...
}

データベース接続とテーブルオプション

データベース接続に対してスキーマ操作を実行する場合、アプリケーションのデフォルト接続でない接続を使用するには、connection メソッドを使用します:

    Schema::connection('sqlite')->create('users', function (Blueprint $table) {
$table->id();
});

さらに、テーブルの作成に関する他の側面を定義するために使用できるいくつかのプロパティとメソッドがあります。MySQL を使用する場合、engine プロパティを使用してテーブルのストレージエンジンを指定できます:

    Schema::create('users', function (Blueprint $table) {
$table->engine('InnoDB');

// ...
});

MySQL を使用する場合、charset および collation プロパティを使用して、作成されるテーブルの文字セットと照合順序を指定できます:

    Schema::create('users', function (Blueprint $table) {
$table->charset('utf8mb4');
$table->collation('utf8mb4_unicode_ci');

// ...
});

temporary メソッドを使用して、テーブルを「一時的」にすることができます。一時テーブルは現在の接続のデータベースセッションでのみ表示され、接続が閉じられると自動的に削除されます:

    Schema::create('calculations', function (Blueprint $table) {
$table->temporary();

// ...
});

データベーステーブルに「コメント」を追加したい場合は、テーブルインスタンスで comment メソッドを呼び出すことができます。テーブルコメントは現在、MySQL と PostgreSQL でのみサポートされています:

    Schema::create('calculations', function (Blueprint $table) {
$table->comment('Business calculations');

// ...
});

テーブルの更新

Schema ファサードの table メソッドを使用して既存のテーブルを更新できます。create メソッドと同様に、table メソッドは、テーブルの名前と、列やインデックスを追加するために使用できる Blueprint インスタンスを受け取るクロージャを受け入れます:

    use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});

テーブルの名前変更 / 削除

既存のデータベーステーブルの名前を変更するには、rename メソッドを使用します:

    use Illuminate\Support\Facades\Schema;

Schema::rename($from, $to);

既存のテーブルを削除するには、drop メソッドまたは dropIfExists メソッドを使用できます:

    Schema::drop('users');

Schema::dropIfExists('users');

外部キーを持つテーブルの名前変更

テーブルの名前を変更する前に、マイグレーションファイルでテーブルに対する外部キー制約が暗黙の名前ではなく明示的な名前を持つことを確認する必要があります。そうしないと、外部キー制約の名前は古いテーブル名を参照します。

カラム

カラムの作成

Schema ファサードの table メソッドを使用して既存のテーブルを更新できます。create メソッドと同様に、table メソッドはテーブルの名前と、テーブルにカラムを追加するために使用できる Illuminate\Database\Schema\Blueprint インスタンスを受け取るクロージャを引数として受け入れます:

    use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});

利用可能なカラムタイプ

スキーマビルダーのブループリントには、データベーステーブルに追加できるさまざまなタイプのカラムに対応するメソッドが用意されています。利用可能な各メソッドは以下の表にリストされています:

bigIncrements()

bigIncrements メソッドは、自動インクリメントの UNSIGNED BIGINT(主キー)と同等の列を作成します:

    $table->bigIncrements('id');

bigInteger()

bigInteger メソッドは、BIGINT と同等の列を作成します:

    $table->bigInteger('votes');

binary()

binary メソッドは、BLOB と同等の列を作成します:

    $table->binary('photo');

MySQL、MariaDB、または SQL Server を利用する場合、lengthfixed 引数を渡すことで、VARBINARY または BINARY と同等の列を作成できます:

    $table->binary('data', length: 16); // VARBINARY(16)

$table->binary('data', length: 16, fixed: true); // BINARY(16)

boolean()

boolean メソッドは、BOOLEAN と同等の列を作成します:

    $table->boolean('confirmed');

char()

char メソッドは、指定された長さの CHAR と同等の列を作成します:

    $table->char('name', length: 100);

dateTimeTz()

dateTimeTz メソッドは、オプションの小数秒精度を持つ DATETIME(タイムゾーン付き)と同等の列を作成します:

    $table->dateTimeTz('created_at', precision: 0);

dateTime()

dateTime メソッドは、オプションの小数秒精度を持つ DATETIME と同等の列を作成します:

    $table->dateTime('created_at', precision: 0);

date()

date メソッドは、DATE と同等の列を作成します:

    $table->date('created_at');

decimal()

decimal メソッドは、指定された精度(総桁数)とスケール(小数桁数)を持つ DECIMAL と同等の列を作成します:

    $table->decimal('amount', total: 8, places: 2);

double()

double メソッドは、DOUBLE と同等の列を作成します:

    $table->double('amount');

enum()

enum メソッドは、指定された有効な値を持つ ENUM と同等の列を作成します:

    $table->enum('difficulty', ['easy', 'hard']);

float()

floatメソッドは、指定された精度でFLOATと同等の列を作成します。

    $table->float('amount', precision: 53);

foreignId()

foreignIdメソッドは、UNSIGNED BIGINTと同等の列を作成します。

    $table->foreignId('user_id');

foreignIdFor()

foreignIdForメソッドは、指定されたモデルクラスのために{column}_idと同等の列を追加します。列のタイプは、モデルキーのタイプに応じてUNSIGNED BIGINTCHAR(36)、またはCHAR(26)になります。

    $table->foreignIdFor(User::class);

foreignUlid()

foreignUlidメソッドは、ULIDと同等の列を作成します。

    $table->foreignUlid('user_id');

foreignUuid()

foreignUuidメソッドは、UUIDと同等の列を作成します。

    $table->foreignUuid('user_id');

geography()

geographyメソッドは、指定された空間タイプとSRID(空間参照システム識別子)でGEOGRAPHYと同等の列を作成します。

    $table->geography('coordinates', subtype: 'point', srid: 4326);

注記

空間タイプのサポートは、データベースドライバに依存します。データベースのドキュメントを参照してください。アプリケーションがPostgreSQLデータベースを利用している場合、geographyメソッドを使用する前にPostGIS拡張機能をインストールする必要があります。

geometry()

geometryメソッドは、指定された空間タイプとSRID(空間参照システム識別子)でGEOMETRYと同等の列を作成します。

    $table->geometry('positions', subtype: 'point', srid: 0);

注記

空間タイプのサポートは、データベースドライバに依存します。データベースのドキュメントを参照してください。アプリケーションがPostgreSQLデータベースを利用している場合、geometryメソッドを使用する前にPostGIS拡張機能をインストールする必要があります。

idメソッドはbigIncrementsメソッドのエイリアスです。デフォルトでは、このメソッドはid列を作成しますが、別の名前を列に割り当てたい場合は、列名を渡すことができます:

    $table->id();

increments()

incrementsメソッドは、自動増分のUNSIGNED INTEGERと同等の列を主キーとして作成します:

    $table->increments('id');

integer()

integerメソッドはINTEGERと同等の列を作成します:

    $table->integer('votes');

ipAddress()

ipAddressメソッドはVARCHARと同等の列を作成します:

    $table->ipAddress('visitor');

When using PostgreSQL, an `INET` column will be created.

json()

jsonメソッドはJSONと同等の列を作成します:

    $table->json('options');

jsonb()

jsonbメソッドはJSONBと同等の列を作成します:

    $table->jsonb('options');

longText()

longTextメソッドはLONGTEXTと同等の列を作成します:

    $table->longText('description');

MySQLまたはMariaDBを使用する場合、LONGBLOBと同等の列を作成するために、列にbinary文字セットを適用することができます:

    $table->longText('data')->charset('binary'); // LONGBLOB

macAddress()

macAddressメソッドはMACアドレスを保持するために意図された列を作成します。PostgreSQLなど一部のデータベースシステムには、このタイプのデータ用の専用の列タイプがあります。他のデータベースシステムでは、文字列と同等の列が使用されます:

    $table->macAddress('device');

mediumIncrements()

mediumIncrementsメソッドは、自動増分のUNSIGNED MEDIUMINTと同等の列を主キーとして作成します:

    $table->mediumIncrements('id');

mediumInteger()

    $table->mediumInteger('votes');

mediumText()

mediumTextメソッドはMEDIUMTEXTに相当するカラムを作成します:

    $table->mediumText('description');

MySQLまたはMariaDBを利用する場合、MEDIUMBLOBに相当するカラムを作成するためにカラムにbinary文字セットを適用することができます:

    $table->mediumText('data')->charset('binary'); // MEDIUMBLOB

morphs()

morphsメソッドは、{column}_idに相当するカラムと{column}_typeに相当するVARCHARカラムを追加する便利なメソッドです。{column}_idのカラムタイプは、モデルキーのタイプに応じてUNSIGNED BIGINTCHAR(36)、またはCHAR(26)になります。

このメソッドは、多態性のEloquentリレーションシップに必要なカラムを定義する際に使用されることを意図しています。次の例では、taggable_idtaggable_typeのカラムが作成されます:

    $table->morphs('taggable');

nullableTimestamps()

nullableTimestampsメソッドは、timestampsメソッドのエイリアスです:

    $table->nullableTimestamps(precision: 0);

nullableMorphs()

このメソッドはmorphsメソッドと似ていますが、作成されるカラムは「nullable」になります:

    $table->nullableMorphs('taggable');

nullableUlidMorphs()

このメソッドはulidMorphsメソッドと似ていますが、作成されるカラムは「nullable」になります:

    $table->nullableUlidMorphs('taggable');

nullableUuidMorphs()

このメソッドはuuidMorphsメソッドと似ていますが、作成されるカラムは「nullable」になります:

    $table->nullableUuidMorphs('taggable');

rememberToken()

rememberTokenメソッドは、現在の「remember me」認証トークンを格納するために意図されたnullableなVARCHAR(100)に相当するカラムを作成します:

    $table->rememberToken();

set()

setメソッドは、指定された有効な値のリストでSET相当のカラムを作成します。

    $table->set('flavors', ['strawberry', 'vanilla']);

smallIncrements()

smallIncrementsメソッドは、プライマリキーとしてのUNSIGNED SMALLINT相当の自動増分カラムを作成します。

    $table->smallIncrements('id');

smallInteger()

smallIntegerメソッドは、SMALLINT相当のカラムを作成します。

    $table->smallInteger('votes');

softDeletesTz()

softDeletesTzメソッドは、オプションの小数秒精度を持つ、削除されたdeleted_at TIMESTAMP(タイムゾーン付き)相当のカラムを追加します。このカラムは、Eloquentの「ソフトデリート」機能に必要なdeleted_atタイムスタンプを保存するために使用されます。

    $table->softDeletesTz('deleted_at', precision: 0);

softDeletes()

softDeletesメソッドは、オプションの小数秒精度を持つ、削除されたdeleted_at TIMESTAMP相当のカラムを追加します。このカラムは、Eloquentの「ソフトデリート」機能に必要なdeleted_atタイムスタンプを保存するために使用されます。

    $table->softDeletes('deleted_at', precision: 0);

string()

stringメソッドは、指定された長さのVARCHAR相当のカラムを作成します。

    $table->string('name', length: 100);

text()

textメソッドは、TEXT相当のカラムを作成します。

    $table->text('description');

MySQLまたはMariaDBを使用する場合、BLOB相当のカラムを作成するために、カラムにbinary文字セットを適用することができます。

    $table->text('data')->charset('binary'); // BLOB

timeTz()

timeTzメソッドは、オプションの小数秒精度を持つTIME(タイムゾーン付き)相当のカラムを作成します。

    $table->timeTz('sunrise', precision: 0);

time()

timeメソッドは、オプションの小数秒精度を持つTIME相当のカラムを作成します:

    $table->time('sunrise', precision: 0);

timestampTz()

timestampTzメソッドは、オプションの小数秒精度を持つTIMESTAMP(タイムゾーン付き)相当のカラムを作成します:

    $table->timestampTz('added_at', precision: 0);

timestamp()

timestampメソッドは、オプションの小数秒精度を持つTIMESTAMP相当のカラムを作成します:

    $table->timestamp('added_at', precision: 0);

timestampsTz()

timestampsTzメソッドは、オプションの小数秒精度を持つcreated_atおよびupdated_atTIMESTAMP(タイムゾーン付き)相当のカラムを作成します:

    $table->timestampsTz(precision: 0);

timestamps()

timestampsメソッドは、オプションの小数秒精度を持つcreated_atおよびupdated_atTIMESTAMP相当のカラムを作成します:

    $table->timestamps(precision: 0);

tinyIncrements()

tinyIncrementsメソッドは、プライマリキーとしてのUNSIGNED TINYINT相当の自動増分カラムを作成します:

    $table->tinyIncrements('id');

tinyInteger()

tinyIntegerメソッドは、TINYINT相当のカラムを作成します:

    $table->tinyInteger('votes');

tinyText()

tinyTextメソッドは、TINYTEXT相当のカラムを作成します:

    $table->tinyText('notes');

MySQLまたはMariaDBを利用する場合、TINYBLOB相当のカラムを作成するために、カラムにbinary文字セットを適用することができます:

    $table->tinyText('data')->charset('binary'); // TINYBLOB

unsignedBigInteger()

unsignedBigIntegerメソッドは、UNSIGNED BIGINT相当のカラムを作成します:

    $table->unsignedBigInteger('votes');

unsignedIntegerメソッドはUNSIGNED INTEGERと同等のカラムを作成します:

    $table->unsignedInteger('votes');

unsignedMediumInteger()メソッドはUNSIGNED MEDIUMINTと同等のカラムを作成します:

    $table->unsignedMediumInteger('votes');

unsignedSmallInteger()メソッドはUNSIGNED SMALLINTと同等のカラムを作成します:

    $table->unsignedSmallInteger('votes');

unsignedTinyInteger()メソッドはUNSIGNED TINYINTと同等のカラムを作成します:

    $table->unsignedTinyInteger('votes');

ulidMorphs()メソッドは、{column}_id{column}_typeの2つのカラムを追加する便利なメソッドです。{column}_idCHAR(26)となり、{column}_typeVARCHARとなります。

このメソッドは、ULID識別子を使用する多態性Eloquentリレーションシップに必要なカラムを定義する際に使用されます。次の例では、taggable_idtaggable_typeのカラムが作成されます:

    $table->ulidMorphs('taggable');

uuidMorphs()メソッドは、{column}_id{column}_typeの2つのカラムを追加する便利なメソッドです。{column}_idCHAR(36)となり、{column}_typeVARCHARとなります。

このメソッドは、UUID識別子を使用する多態性Eloquentリレーションシップに必要なカラムを定義する際に使用されます。次の例では、taggable_idtaggable_typeのカラムが作成されます:

    $table->uuidMorphs('taggable');

ulid()メソッドはULIDと同等のカラムを作成します:

    $table->ulid('id');

uuid()メソッドはUUIDと同等のカラムを作成します:

    $table->uuid('id');

year()

yearメソッドはYEARと同等のカラムを作成します:

    $table->year('birth_year');

カラム修飾子

上記にリストされているカラムタイプに加えて、データベーステーブルにカラムを追加する際に使用できるいくつかのカラム「修飾子」があります。たとえば、カラムを「nullable」にするには、nullableメソッドを使用できます:

    use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});

以下の表には、利用可能なすべてのカラム修飾子が含まれています。このリストには、インデックス修飾子は含まれていません:

修飾子説明
->after('column')他のカラムの「後」にカラムを配置します(MySQL)。
->autoIncrement()INTEGERカラムを自動増分(主キー)に設定します。
->charset('utf8mb4')カラムの文字セットを指定します(MySQL)。
->collation('utf8mb4_unicode_ci')カラムの照合順序を指定します。
->comment('my comment')カラムにコメントを追加します(MySQL / PostgreSQL)。
->default($value)カラムの「デフォルト」値を指定します。
->first()カラムをテーブルの「最初」に配置します(MySQL)。
->from($integer)自動増分フィールドの開始値を設定します(MySQL / PostgreSQL)。
->invisible()カラムをSELECT *クエリから「非表示」にします(MySQL)。
->nullable($value = true)NULL値をカラムに挿入できるようにします。
->storedAs($expression)格納生成カラムを作成します(MySQL / PostgreSQL / SQLite)。
->unsigned()INTEGERカラムをUNSIGNEDに設定します(MySQL)。
->useCurrent()TIMESTAMPカラムをデフォルト値としてCURRENT_TIMESTAMPを使用します。
->useCurrentOnUpdate()レコードが更新されるときにTIMESTAMPカラムがCURRENT_TIMESTAMPを使用するように設定します(MySQL)。
->virtualAs($expression)仮想生成カラムを作成します(MySQL / SQLite)。
->generatedAs($expression)指定されたシーケンスオプションでidentityカラムを作成します(PostgreSQL)。
->always()identityカラムの入力に対するシーケンス値の優先順位を定義します(PostgreSQL)。

デフォルト式

default モディファイアは値または Illuminate\Database\Query\Expression インスタンスを受け入れます。Expression インスタンスを使用すると、Laravel が値を引用符で囲むのを防ぎ、データベース固有の関数を使用できます。これが特に役立つ状況の1つは、JSON カラムにデフォルト値を割り当てる必要がある場合です:

    <?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Query\Expression;
use Illuminate\Database\Migrations\Migration;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->json('movies')->default(new Expression('(JSON_ARRAY())'));
$table->timestamps();
});
}
};

警告

デフォルト式のサポートは、データベースドライバー、データベースバージョン、およびフィールドタイプに依存します。データベースのドキュメントを参照してください。

カラムの順序

MySQL データベースを使用する場合、after メソッドを使用してスキーマ内の既存のカラムの後にカラムを追加できます:

    $table->after('password', function (Blueprint $table) {
$table->string('address_line1');
$table->string('address_line2');
$table->string('city');
});

カラムの変更

change メソッドを使用すると、既存のカラムのタイプと属性を変更できます。たとえば、string カラムのサイズを増やしたい場合があります。change メソッドを実行する方法を確認するために、name カラムのサイズを 25 から 50 に増やしてみましょう。これを達成するためには、単純にカラムの新しい状態を定義し、その後 change メソッドを呼び出します:

    Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});

カラムを変更する場合、カラム定義に保持したいすべての修飾子を明示的に含める必要があります - 不足している属性は削除されます。たとえば、unsigneddefaultcomment 属性を保持するには、カラムを変更する際に各修飾子を明示的に呼び出す必要があります:

    Schema::table('users', function (Blueprint $table) {
$table->integer('votes')->unsigned()->default(1)->comment('my comment')->change();
});

change メソッドはカラムのインデックスを変更しません。したがって、カラムを変更する際にインデックス修飾子を使用して、インデックスを明示的に追加または削除できます:

// Add an index...
$table->bigIncrements('id')->primary()->change();

// Drop an index...
$table->char('postal_code', 10)->unique(false)->change();

カラムの名前変更

カラムの名前を変更するには、スキーマビルダーが提供する renameColumn メソッドを使用できます:

    Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});

カラムの削除

カラムを削除するには、スキーマビルダーの dropColumn メソッドを使用できます:

    Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});

dropColumn メソッドにカラム名の配列を渡すことで、テーブルから複数のカラムを削除できます:

    Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});

利用可能なコマンドエイリアス

Laravel は、一般的なタイプのカラムを削除するための便利なメソッドをいくつか提供しています。それぞれのメソッドについて、以下の表で説明されています:

コマンド説明
$table->dropMorphs('morphable');morphable_idmorphable_type カラムを削除します。
$table->dropRememberToken();remember_token カラムを削除します。
$table->dropSoftDeletes();deleted_at カラムを削除します。
$table->dropSoftDeletesTz();dropSoftDeletes() メソッドのエイリアスです。
$table->dropTimestamps();created_atupdated_at カラムを削除します。
$table->dropTimestampsTz();dropTimestamps() メソッドのエイリアスです。

インデックス

インデックスの作成

Laravel のスキーマビルダーは、いくつかのタイプのインデックスをサポートしています。次の例では、新しい email カラムを作成し、その値が一意であることを指定しています。インデックスを作成するには、カラム定義に unique メソッドを連結します:

    use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('users', function (Blueprint $table) {
$table->string('email')->unique();
});

または、カラムを定義した後にインデックスを作成することもできます。その場合は、スキーマビルダーブループリントで unique メソッドを呼び出す必要があります。このメソッドは、一意なインデックスを受け取るべきカラムの名前を受け入れます:

    $table->unique('email');

さらに、複数のカラムをインデックスメソッドに渡して、複合インデックスを作成することもできます:

    $table->index(['account_id', 'created_at']);

インデックスを作成する際、Laravel は自動的にテーブル、カラム名、およびインデックスのタイプに基づいてインデックス名を生成しますが、メソッドに第二引数を渡してインデックス名を指定することもできます:

    $table->unique('email', 'unique_email');

利用可能なインデックスのタイプ

Laravel のスキーマビルダーブループリントクラスは、Laravel でサポートされている各種類のインデックスを作成するためのメソッドを提供しています。各インデックスメソッドは、インデックス名を指定するためのオプションの第二引数を受け入れます。省略された場合、名前はインデックスに使用されるテーブルとカラム名、およびインデックスのタイプから派生します。利用可能な各インデックスメソッドについて、以下の表で説明されています:```

コマンド | 説明

------- | ----------- $table->primary('id'); | プライマリキーを追加します。 $table->primary(['id', 'parent_id']); | 複合キーを追加します。 $table->unique('email'); | ユニークインデックスを追加します。 $table->index('state'); | インデックスを追加します。 $table->fullText('body'); | フルテキストインデックスを追加します(MySQL / PostgreSQL)。 $table->fullText('body')->language('english'); | 指定された言語のフルテキストインデックスを追加します(PostgreSQL)。 $table->spatialIndex('location'); | 空間インデックスを追加します(SQLite 以外)。

インデックスの名前変更

インデックスの名前を変更するには、スキーマビルダーブループリントが提供する renameIndex メソッドを使用できます。このメソッドは、現在のインデックス名を第1引数として、希望する名前を第2引数として受け入れます:

    $table->renameIndex('from', 'to')

インデックスの削除

インデックスを削除するには、インデックスの名前を指定する必要があります。デフォルトでは、Laravel はテーブル名、インデックス化された列の名前、およびインデックスの種類に基づいてインデックス名を自動的に割り当てます。以下にいくつかの例を示します:

コマンド説明
$table->dropPrimary('users_id_primary');"users" テーブルからプライマリキーを削除します。
$table->dropUnique('users_email_unique');"users" テーブルからユニークインデックスを削除します。
$table->dropIndex('geo_state_index');"geo" テーブルから基本的なインデックスを削除します。
$table->dropFullText('posts_body_fulltext');"posts" テーブルからフルテキストインデックスを削除します。
$table->dropSpatialIndex('geo_location_spatialindex');"geo" テーブルから空間インデックスを削除します(SQLite 以外)。

インデックスを削除するメソッドに列の配列を渡すと、テーブル名、列、およびインデックスの種類に基づいて従来のインデックス名が生成されます:

    Schema::table('geo', function (Blueprint $table) {
$table->dropIndex(['state']); // Drops index 'geo_state_index'
});

外部キー制約

Laravel はデータベースレベルで参照整合性を強制するために使用される外部キー制約の作成もサポートしています。たとえば、posts テーブルに id 列を参照する users テーブル上の user_id 列を定義しましょう:

    use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('posts', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');

$table->foreign('user_id')->references('id')->on('users');
});

この構文はかなり冗長ですが、Laravelは開発者にとってより良いエクスペリエンスを提供するための規約を使用した、追加の簡潔なメソッドを提供しています。foreignId メソッドを使用して列を作成する場合、上記の例は次のように書き直すことができます:

    Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained();
});

foreignId メソッドは UNSIGNED BIGINT と同等の列を作成し、constrained メソッドはテーブルと参照される列を決定するための規約を使用します。テーブル名がLaravelの規約と一致しない場合は、constrained メソッドに手動で指定することもできます。さらに、生成されたインデックスに割り当てるべき名前も指定できます:

    Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained(
table: 'users', indexName: 'posts_user_id'
);
});

"on delete" および "on update" プロパティのための望ましいアクションを指定することもできます:

    $table->foreignId('user_id')
->constrained()
->onUpdate('cascade')
->onDelete('cascade');

これらのアクションに対しても、代替的で表現力豊かな構文が提供されています:

メソッド説明
$table->cascadeOnUpdate();更新はカスケードする。
$table->restrictOnUpdate();更新は制限される。
$table->noActionOnUpdate();更新時のアクションなし。
$table->cascadeOnDelete();削除はカスケードする。
$table->restrictOnDelete();削除は制限される。
$table->nullOnDelete();削除時に外部キーの値を null に設定する。

constrained メソッドの前には、任意の追加の 列修飾子 を呼び出す必要があります:

    $table->foreignId('user_id')
->nullable()
->constrained();

外部キーの削除

外部キーを削除するには、dropForeign メソッドを使用し、削除する外部キー制約の名前を引数として渡します。外部キー制約はインデックスと同じ命名規則を使用します。つまり、外部キー制約名は、制約のテーブル名と列の名前に基づいており、"_foreign" 接尾辞が続きます:

    $table->dropForeign('posts_user_id_foreign');

または、外部キーを保持する列名を dropForeign メソッドに渡すこともできます。配列は、Laravel の制約命名規則を使用して外部キー制約名に変換されます:

    $table->dropForeign(['user_id']);

外部キー制約の切り替え

マイグレーション内で外部キー制約を有効または無効にするには、次のメソッドを使用します:

    Schema::enableForeignKeyConstraints();

Schema::disableForeignKeyConstraints();

Schema::withoutForeignKeyConstraints(function () {
// Constraints disabled within this closure...
});

警告

SQLite はデフォルトで外部キー制約を無効にしています。SQLite を使用する場合は、マイグレーションでそれらを作成しようとする前に、データベース構成で 外部キーのサポートを有効に することを確認してください。さらに、SQLite はテーブルの作成時にのみ外部キーをサポートし、テーブルが変更されるときにはサポートしません

イベント

便宜上、各マイグレーション操作は イベント をディスパッチします。以下のイベントはすべて、基本となる Illuminate\Database\Events\MigrationEvent クラスを拡張しています:

クラス説明
Illuminate\Database\Events\MigrationsStarted一括のマイグレーションが実行される直前です。
Illuminate\Database\Events\MigrationsEnded一括のマイグレーションが実行を完了しました。
Illuminate\Database\Events\MigrationStarted個々のマイグレーションが実行される直前です。
Illuminate\Database\Events\MigrationEnded個々のマイグレーションが実行を完了しました。
Illuminate\Database\Events\NoPendingMigrationsマイグレーションコマンドが保留中のマイグレーションを見つけませんでした。
Illuminate\Database\Events\SchemaDumpedデータベーススキーマのダンプが完了しました。
Illuminate\Database\Events\SchemaLoaded既存のデータベーススキーマのダンプが読み込まれました。