はじめに

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

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

マイグレーションの生成

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

  1. php artisan make:migration create_flights_table

Laravelは、マイグレーションの名前を使用して、テーブルの名前を推測し、マイグレーションが新しいテーブルを作成するかどうかを判断しようとします。Laravelがマイグレーション名からテーブル名を特定できる場合、Laravelは生成されたマイグレーションファイルを指定されたテーブルで事前に埋めます。そうでない場合は、マイグレーションファイル内で手動でテーブルを指定できます。

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

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

マイグレーションの圧縮

アプリケーションを構築するにつれて、時間とともにますます多くのマイグレーションが蓄積されることがあります。これにより、database/migrationsディレクトリが数百のマイグレーションで膨れ上がる可能性があります。希望する場合は、マイグレーションを単一のSQLファイルに「圧縮」できます。始めるには、schema:dumpコマンドを実行します:

  1. php artisan schema:dump
  2. # 現在のデータベーススキーマをダンプし、すべての既存のマイグレーションを削除...
  3. php artisan schema:dump --prune

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

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

  1. php artisan schema:dump
  2. php artisan schema:dump --database=testing --prune

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

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

マイグレーション構造

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

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

  1. <?php
  2. use Illuminate\Database\Migrations\Migration;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Support\Facades\Schema;
  5. return new class extends Migration
  6. {
  7. /**
  8. * Run the migrations.
  9. */
  10. public function up(): void
  11. {
  12. Schema::create('flights', function (Blueprint $table) {
  13. $table->id();
  14. $table->string('name');
  15. $table->string('airline');
  16. $table->timestamps();
  17. });
  18. }
  19. /**
  20. * Reverse the migrations.
  21. */
  22. public function down(): void
  23. {
  24. Schema::drop('flights');
  25. }
  26. };

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

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

  1. /**
  2. * The database connection that should be used by the migration.
  3. *
  4. * @var string
  5. */
  6. protected $connection = 'pgsql';
  7. /**
  8. * Run the migrations.
  9. */
  10. public function up(): void
  11. {
  12. // ...
  13. }

マイグレーションの実行

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

  1. php artisan migrate

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

  1. php artisan migrate:status

マイグレーションによって実行されるSQL文を実際に実行せずに確認したい場合は、--pretendフラグをmigrateコマンドに提供できます:

  1. php artisan migrate --pretend

マイグレーション実行の隔離

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

  1. ``````shell
  2. php artisan migrate --isolated
  3. `

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

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

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

  1. php artisan migrate --force

マイグレーションのロールバック

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

  1. php artisan migrate:rollback
  1. ``````shell
  2. php artisan migrate:rollback --step=5
  3. `

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

  1. php artisan migrate:rollback --batch=3

マイグレーションによって実行されるSQL文を実際に実行せずに確認したい場合は、--pretendフラグをmigrate:rollbackコマンドに提供できます:

  1. php artisan migrate:rollback --pretend
  1. ``````shell
  2. php artisan migrate:reset
  3. `

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

  1. ``````shell
  2. php artisan migrate:refresh
  3. # データベースをリフレッシュし、すべてのデータベースシードを実行...
  4. php artisan migrate:refresh --seed
  5. `

限られた数のマイグレーションをロールバックして再マイグレーションするには、stepオプションをrefreshコマンドに提供します。たとえば、次のコマンドは最後の5つのマイグレーションをロールバックして再マイグレーションします:

  1. php artisan migrate:refresh --step=5

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

  1. ``````shell
  2. php artisan migrate:fresh
  3. php artisan migrate:fresh --seed
  4. `

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

  1. php artisan migrate:fresh --database=admin
  1. <a name="tables"></a>
  2. ## テーブル
  3. <a name="creating-tables"></a>
  4. ### テーブルの作成
  5. 新しいデータベーステーブルを作成するには、`````create`````メソッドを`````Schema`````ファサードで使用します。`````create`````メソッドは2つの引数を受け取ります:最初はテーブルの名前で、2番目は新しいテーブルを定義するために使用できる`````Blueprint`````オブジェクトを受け取るクロージャです:
  6. ``````php
  7. use Illuminate\Database\Schema\Blueprint;
  8. use Illuminate\Support\Facades\Schema;
  9. Schema::create('users', function (Blueprint $table) {
  10. $table->id();
  11. $table->string('name');
  12. $table->string('email');
  13. $table->timestamps();
  14. });
  15. `

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

テーブル/カラムの存在確認

テーブル、カラム、またはインデックスの存在を確認するには、hasTablehasColumn、およびhasIndexメソッドを使用します:

  1. if (Schema::hasTable('users')) {
  2. // The "users" table exists...
  3. }
  4. if (Schema::hasColumn('users', 'email')) {
  5. // The "users" table exists and has an "email" column...
  6. }
  7. if (Schema::hasIndex('users', ['email'], 'unique')) {
  8. // The "users" table exists and has a unique index on the "email" column...
  9. }

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

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

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

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

  1. Schema::create('users', function (Blueprint $table) {
  2. $table->engine('InnoDB');
  3. // ...
  4. });
  1. ``````php
  2. Schema::create('users', function (Blueprint $table) {
  3. $table->charset('utf8mb4');
  4. $table->collation('utf8mb4_unicode_ci');
  5. // ...
  6. });
  7. `
  1. ``````php
  2. Schema::create('calculations', function (Blueprint $table) {
  3. $table->temporary();
  4. // ...
  5. });
  6. `

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

  1. Schema::create('calculations', function (Blueprint $table) {
  2. $table->comment('Business calculations');
  3. // ...
  4. });

テーブルの更新

  1. ``````php
  2. use Illuminate\Database\Schema\Blueprint;
  3. use Illuminate\Support\Facades\Schema;
  4. Schema::table('users', function (Blueprint $table) {
  5. $table->integer('votes');
  6. });
  7. `

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

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

  1. use Illuminate\Support\Facades\Schema;
  2. Schema::rename($from, $to);

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

  1. Schema::drop('users');
  2. Schema::dropIfExists('users');

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

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

カラム

カラムの作成

  1. ``````php
  2. use Illuminate\Database\Schema\Blueprint;
  3. use Illuminate\Support\Facades\Schema;
  4. Schema::table('users', function (Blueprint $table) {
  5. $table->integer('votes');
  6. });
  7. `

利用可能なカラムタイプ

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

bigIncrements bigInteger binary boolean char dateTimeTz dateTime date decimal double enum float foreignId foreignIdFor foreignUlid foreignUuid geography geometry id increments integer ipAddress json jsonb longText macAddress mediumIncrements mediumInteger mediumText morphs nullableMorphs nullableTimestamps nullableUlidMorphs nullableUuidMorphs rememberToken set smallIncrements smallInteger softDeletesTz softDeletes string text timeTz time timestampTz timestamp timestampsTz timestamps tinyIncrements tinyInteger tinyText unsignedBigInteger unsignedInteger unsignedMediumInteger unsignedSmallInteger unsignedTinyInteger ulidMorphs uuidMorphs ulid uuid year

bigIncrements()

bigIncrementsメソッドは、自動インクリメントするUNSIGNED BIGINT(主キー)に相当するカラムを作成します:

  1. $table->bigIncrements('id');

bigInteger()

  1. ``````php
  2. $table->bigInteger('votes');
  3. `

binary()

  1. ``````php
  2. $table->binary('photo');
  3. `

MySQL、MariaDB、またはSQL Serverを使用する場合、lengthおよびfixed引数を渡して、VARBINARYまたはBINARYに相当するカラムを作成できます:

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

boolean()

  1. ``````php
  2. $table->boolean('confirmed');
  3. `

char()

  1. ``````php
  2. $table->char('name', length: 100);
  3. `

dateTimeTz()

  1. ``````php
  2. $table->dateTimeTz('created_at', precision: 0);
  3. `

dateTime()

  1. ``````php
  2. $table->dateTime('created_at', precision: 0);
  3. `

date()

  1. ``````php
  2. $table->date('created_at');
  3. `

decimal()

  1. ``````php
  2. $table->decimal('amount', total: 8, places: 2);
  3. `

double()

  1. ``````php
  2. $table->double('amount');
  3. `

enum()

  1. ``````php
  2. $table->enum('difficulty', ['easy', 'hard']);
  3. `

float()

  1. ``````php
  2. $table->float('amount', precision: 53);
  3. `

foreignId()

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

  1. $table->foreignId('user_id');

foreignIdFor()

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

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

foreignUlid()

  1. ``````php
  2. $table->foreignUlid('user_id');
  3. `

foreignUuid()

  1. ``````php
  2. $table->foreignUuid('user_id');
  3. `

geography()

  1. ``````php
  2. $table->geography('coordinates', subtype: 'point', srid: 4326);
  3. `

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

geometry()

  1. ``````php
  2. $table->geometry('positions', subtype: 'point', srid: 0);
  3. `

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

id()

  1. ``````php
  2. $table->id();
  3. `

increments()

incrementsメソッドは、自動インクリメントするUNSIGNED INTEGERに相当するカラムを主キーとして作成します:

  1. $table->increments('id');

integer()

  1. ``````php
  2. $table->integer('votes');
  3. `

ipAddress()

  1. ``````php
  2. $table->ipAddress('visitor');
  3. `

PostgreSQLを使用する場合、INETカラムが作成されます。

json()

  1. ``````php
  2. $table->json('options');
  3. `

jsonb()

  1. ``````php
  2. $table->jsonb('options');
  3. `

longText()

  1. ``````php
  2. $table->longText('description');
  3. `

MySQLまたはMariaDBを利用する場合、カラムにbinary文字セットを適用して、LONGBLOBに相当するカラムを作成できます:

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

macAddress()

  1. ``````php
  2. $table->macAddress('device');
  3. `

mediumIncrements()

mediumIncrementsメソッドは、自動インクリメントするUNSIGNED MEDIUMINTに相当するカラムを主キーとして作成します:

  1. $table->mediumIncrements('id');

mediumInteger()

  1. ``````php
  2. $table->mediumInteger('votes');
  3. `

mediumText()

  1. ``````php
  2. $table->mediumText('description');
  3. `

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

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

morphs()

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

このメソッドは、ポリモーフィックなエロクアントリレーションシップに必要なカラムを定義する際に使用されることを意図しています。次の例では、taggable_idおよびtaggable_typeカラムが作成されます:

  1. $table->morphs('taggable');

nullableTimestamps()

  1. ``````php
  2. $table->nullableTimestamps(precision: 0);
  3. `

nullableMorphs()

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

  1. $table->nullableMorphs('taggable');

nullableUlidMorphs()

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

  1. $table->nullableUlidMorphs('taggable');

nullableUuidMorphs()

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

  1. $table->nullableUuidMorphs('taggable');

rememberToken()

  1. ``````php
  2. $table->rememberToken();
  3. `

set()

  1. ``````php
  2. $table->set('flavors', ['strawberry', 'vanilla']);
  3. `

smallIncrements()

smallIncrementsメソッドは、自動インクリメントするUNSIGNED SMALLINTに相当するカラムを主キーとして作成します:

  1. $table->smallIncrements('id');

smallInteger()

  1. ``````php
  2. $table->smallInteger('votes');
  3. `

softDeletesTz()

softDeletesTzメソッドは、nullableなdeleted_at TIMESTAMP(タイムゾーン付き)に相当するカラムを作成し、オプションの小数秒精度を持ちます。このカラムは、Eloquentの「ソフト削除」機能に必要なdeleted_atタイムスタンプを保存することを目的としています:

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

softDeletes()

softDeletesメソッドは、nullableなdeleted_at TIMESTAMPに相当するカラムを作成し、オプションの小数秒精度を持ちます。このカラムは、Eloquentの「ソフト削除」機能に必要なdeleted_atタイムスタンプを保存することを目的としています:

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

string()

  1. ``````php
  2. $table->string('name', length: 100);
  3. `

text()

  1. ``````php
  2. $table->text('description');
  3. `

MySQLまたはMariaDBを利用する場合、カラムにbinary文字セットを適用して、BLOBに相当するカラムを作成できます:

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

timeTz()

  1. ``````php
  2. $table->timeTz('sunrise', precision: 0);
  3. `

time()

  1. ``````php
  2. $table->time('sunrise', precision: 0);
  3. `

timestampTz()

  1. ``````php
  2. $table->timestampTz('added_at', precision: 0);
  3. `

timestamp()

  1. ``````php
  2. $table->timestamp('added_at', precision: 0);
  3. `

timestampsTz()

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

  1. $table->timestampsTz(precision: 0);

timestamps()

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

  1. $table->timestamps(precision: 0);

tinyIncrements()

tinyIncrementsメソッドは、自動インクリメントするUNSIGNED TINYINTに相当するカラムを主キーとして作成します:

  1. $table->tinyIncrements('id');

tinyInteger()

  1. ``````php
  2. $table->tinyInteger('votes');
  3. `

tinyText()

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

  1. $table->tinyText('notes');

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

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

unsignedBigInteger()

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

  1. $table->unsignedBigInteger('votes');

unsignedInteger()

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

  1. $table->unsignedInteger('votes');

unsignedMediumInteger()

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

  1. $table->unsignedMediumInteger('votes');

unsignedSmallInteger()

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

  1. $table->unsignedSmallInteger('votes');

unsignedTinyInteger()

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

  1. $table->unsignedTinyInteger('votes');

ulidMorphs()

ulidMorphs メソッドは、{column}_id CHAR(26) 相当のカラムと、{column}_type VARCHAR 相当のカラムを追加する便利なメソッドです。

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

  1. $table->ulidMorphs('taggable');

uuidMorphs()

uuidMorphs メソッドは、{column}_id CHAR(36) 相当のカラムと、{column}_type VARCHAR 相当のカラムを追加する便利なメソッドです。

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

  1. $table->uuidMorphs('taggable');

ulid()

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

  1. $table->ulid('id');

uuid()

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

  1. $table->uuid('id');

year()

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

  1. $table->year('birth_year');

Column Modifiers

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

  1. use Illuminate\Database\Schema\Blueprint;
  2. use Illuminate\Support\Facades\Schema;
  3. Schema::table('users', function (Blueprint $table) {
  4. $table->string('email')->nullable();
  5. });

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

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

Default Expressions

default 修飾子は、値または Illuminate\Database\Query\Expression インスタンスを受け入れます。Expression インスタンスを使用すると、Laravel が値を引用符で囲むのを防ぎ、データベース固有の関数を使用できるようになります。この機能が特に便利な状況は、JSON カラムにデフォルト値を割り当てる必要があるときです:

  1. <?php
  2. use Illuminate\Support\Facades\Schema;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Database\Query\Expression;
  5. use Illuminate\Database\Migrations\Migration;
  6. return new class extends Migration
  7. {
  8. /**
  9. * Run the migrations.
  10. */
  11. public function up(): void
  12. {
  13. Schema::create('flights', function (Blueprint $table) {
  14. $table->id();
  15. $table->json('movies')->default(new Expression('(JSON_ARRAY())'));
  16. $table->timestamps();
  17. });
  18. }
  19. };

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

Column Order

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

  1. $table->after('password', function (Blueprint $table) {
  2. $table->string('address_line1');
  3. $table->string('address_line2');
  4. $table->string('city');
  5. });

Modifying Columns

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

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

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

  1. Schema::table('users', function (Blueprint $table) {
  2. $table->integer('votes')->unsigned()->default(1)->comment('my comment')->change();
  3. });
  1. ``````php
  2. // Add an index...
  3. $table->bigIncrements('id')->primary()->change();
  4. // Drop an index...
  5. $table->char('postal_code', 10)->unique(false)->change();
  6. `

Renaming Columns

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

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

Dropping Columns

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

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

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

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

Available Command Aliases

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

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

Indexes

Creating Indexes

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

  1. use Illuminate\Database\Schema\Blueprint;
  2. use Illuminate\Support\Facades\Schema;
  3. Schema::table('users', function (Blueprint $table) {
  4. $table->string('email')->unique();
  5. });

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

  1. $table->unique('email');

カラムの配列をインデックスメソッドに渡して、複合 (または合成) インデックスを作成することもできます:

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

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

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

Available Index Types

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

コマンド 説明
$table->primary('id'); 主キーを追加します。
$table->primary(['id', 'parent_id']); 複合キーを追加します。
$table->unique('email'); 一意のインデックスを追加します。
$table->index('state'); インデックスを追加します。
$table->fullText('body'); フルテキストインデックスを追加します (MariaDB / MySQL / PostgreSQL)。
$table->fullText('body')->language('english'); 指定された言語のフルテキストインデックスを追加します (PostgreSQL)。
$table->spatialIndex('location'); 空間インデックスを追加します (SQLite を除く)。

Renaming Indexes

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

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

Dropping Indexes

インデックスを削除するには、インデックスの名前を指定する必要があります。デフォルトでは、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 を除く)。

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

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

Foreign Key Constraints

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

  1. use Illuminate\Database\Schema\Blueprint;
  2. use Illuminate\Support\Facades\Schema;
  3. Schema::table('posts', function (Blueprint $table) {
  4. $table->unsignedBigInteger('user_id');
  5. $table->foreign('user_id')->references('id')->on('users');
  6. });

この構文はかなり冗長であるため、Laravel は、より良い開発者体験を提供するために、慣例を使用した追加の簡潔なメソッドを提供しています。foreignId メソッドを使用してカラムを作成する場合、上記の例は次のように書き換えることができます:

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

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

  1. Schema::table('posts', function (Blueprint $table) {
  2. $table->foreignId('user_id')->constrained(
  3. table: 'users', indexName: 'posts_user_id'
  4. );
  5. });

制約の「on delete」および「on update」プロパティに対する希望するアクションを指定することもできます:

  1. $table->foreignId('user_id')
  2. ->constrained()
  3. ->onUpdate('cascade')
  4. ->onDelete('cascade');

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

メソッド 説明
$table->cascadeOnUpdate(); 更新はカスケードします。
$table->restrictOnUpdate(); 更新は制限されます。
$table->noActionOnUpdate(); 更新時にアクションはありません。
$table->cascadeOnDelete(); 削除はカスケードします。
$table->restrictOnDelete(); 削除は制限されます。
$table->nullOnDelete(); 削除時に外部キー値を null に設定します。
$table->noActionOnDelete(); 子レコードが存在する場合は削除を防ぎます。

追加の カラム修飾子 は、constrained メソッドの前に呼び出す必要があります:

  1. $table->foreignId('user_id')
  2. ->nullable()
  3. ->constrained();

Dropping Foreign Keys

外部キーを削除するには、dropForeign メソッドを使用し、削除する外部キー制約の名前を引数として渡します。外部キー制約はインデックスと同じ命名規則を使用します。言い換えれば、外部キー制約名は、テーブル名と制約内のカラム名に基づき、”_foreign” サフィックスが付加されます:

  1. $table->dropForeign('posts_user_id_foreign');

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

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

Toggling Foreign Key Constraints

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

  1. Schema::enableForeignKeyConstraints();
  2. Schema::disableForeignKeyConstraints();
  3. Schema::withoutForeignKeyConstraints(function () {
  4. // Constraints disabled within this closure...
  5. });

SQLite はデフォルトで外部キー制約を無効にします。SQLite を使用する場合は、マイグレーション内で作成する前に、データベース設定で 外部キーサポートを有効にする ことを確認してください。

Events

便利なことに、各マイグレーション操作は イベント を発行します。以下のすべてのイベントは、基本 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 既存のデータベーススキーマのダンプが読み込まれました。