Laravel 8.x マイグレーション

イントロダクション

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

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

マイグレーションの生成

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

php artisan make:migration create_flights_table

Laravelは、マイグレーションの名前からテーブル名と新しいテーブルを作成しようとしているかを推測しようとします。Laravelがマイグレーション名からテーブル名を決定できる場合、Laravelは生成するマイグレーションファイルへ指定したテーブル名を事前に埋め込みます。それ以外の場合は、マイグレーションファイルのテーブルを手動で指定してください。

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

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

マイグレーションの圧縮

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

php artisan schema:dump

// 現在のデータベーススキーマをダンプし、既存のすべての移行を削除
php artisan schema:dump --prune

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

チームの新しい開発者がアプリケーションの初期データベース構造をすばやく作成できるようにするため、データベーススキーマファイルはソース管理にコミットすべきでしょう。

Note: マイグレーションの圧縮は、MySQL、PostgreSQL、SQLiteデータベースでのみ利用可能で、データベースのコマンドラインクライアントを利用しています。スキーマダンプは、メモリ内SQLiteデータベースへ復元されない場合があります。

マイグレーションの構造

移行クラスには、updownの2つのメソッドを用意します。upメソッドはデータベースに新しいテーブル、カラム、またはインデックスを追加するために使用します。downメソッドでは、upメソッドによって実行する操作を逆にし、以前の状態へ戻す必要があります。

これらの両方のメソッド内で、Laravelスキーマビルダを使用して、テーブルを明示的に作成および変更できます。Schemaビルダで利用可能なすべてのメソッドを学ぶには、ドキュメントをチェックしてください。たとえば、次のマイグレーションでは、flightsテーブルが作成されます。

<?php

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

class CreateFlightsTable extends Migration
{
    /**
     * マイグレーションの実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('airline');
            $table->timestamps();
        });
    }

    /**
     * マイグレーションを戻す
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('flights');
    }
}

無名マイグレーション

上記の例で気付いたかもしれませんが、Laravelはmake:migrationコマンドで生成した全てのマイグレーションへ自動的にクラス名を割り当てます。しかし、必要であれば、マイグレーションファイルから無名のクラスを返すこともできます。これは主に、アプリケーションが多くのマイグレーションを蓄積し、そのうち2つのマイグレーションでクラス名が衝突している場合に便利です。

<?php

use Illuminate\Database\Migrations\Migration;

return new class extends Migration
{
    //
};

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

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

/**
 * マイグレーションが使用するデータベース接続
 *
 * @var string
 */
protected $connection = 'pgsql';

/**
 * マイグレーションの実行
 *
 * @return void
 */
public function up()
{
    //
}

マイグレーションの実行

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

php artisan migrate

これまでどのマイグレーションが実行されているかを確認したい場合は、migrate:status Artisanコマンドを使用してください。

php artisan migrate:status

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

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

php artisan migrate --force

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

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

php artisan migrate:rollback

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

php artisan migrate:rollback --step=5

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

php artisan migrate:reset

単一コマンドでロールバックとマイグレーション実行

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

php artisan migrate:refresh

// データベースを更新し、すべてのデータベース初期値設定を実行
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

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

テーブル

テーブルの生成

新しいデータベーステーブルを作成するには、Schemaファサードでcreateメソッドを使用します。createメソッドは2つの引数を取ります。1つ目はテーブルの名前で、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();
});

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

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

hasTableおよびhasColumnメソッドを使用して、テーブルまたは列の存在を確認できます。

if (Schema::hasTable('users')) {
    // "users"テーブルは存在していた
}

if (Schema::hasColumn('users', 'email')) {
    // "email"カラムを持つ"users"テーブルが存在していた
}

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

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

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

さらに、他のプロパティやメソッドを使用して、テーブル作成の他の部分を定義できます。engineプロパティはMySQLを使用するときにテーブルのストレージエンジンを指定するために使用します。

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

    // ...
});

charsetプロパティとcollat​​ionプロパティはMySQLを使用するときに、作成されたテーブルの文字セットと照合順序を指定するために使用します。

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

    // ...
});

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

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

    // ...
});

テーブルの更新

Schemaファサードのtableメソッドを使用して、既存のテーブルを更新できます。createメソッドと同様に、tableメソッドは2つの引数を取ります。テーブルの名前とテーブルにカラムやインデックスを追加するために使用できる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');

外部キーを使用したテーブルのリネーム

テーブルをリネームする前に、Laravelのテーブル名ベースの命名規約で外部キーを割り当てさせるのではなく、マイグレーションファイルでテーブルの外部キー制約の名前を明示的に指定していることを確認する必要があります。そうでない場合、外部キー制約名は古いテーブル名で参照されることになるでしょう。

カラム

カラムの生成

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

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

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

利用可能なカラムタイプ

スキーマビルダのBlueprintは、データベーステーブルに追加できるさまざまなタイプのカラムに対応する、多くのメソッドを提供しています。使用可能な各メソッドを以下に一覧します。

bigIncrements()

bigIncrementsメソッドは、自動増分するUNSIGNED BIGINT(主キー)カラムを作成します。

$table->bigIncrements('id');

bigInteger()

bigIntegerメソッドはBIGINTカラムを作成します。

$table->bigInteger('votes');

binary()

binaryメソッドはBLOBカラムを作成します。

$table->binary('photo');

boolean()

booleanメソッドはBOOLEANカラムを作成します。

$table->boolean('confirmed');

char()

charメソッドは、指定した長さのCHARカラムを作成します。

$table->char('name', 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', $precision = 8, $scale = 2);

double()

doubleメソッドは、指定した精度(合計桁数)とスケール(小数桁数)でDOUBLEカラムを作成します。

$table->double('amount', 8, 2);

enum()

enumメソッドは、指定した有効な値でENUMカラムを作成します。

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

float()

floatメソッドは、指定した精度(合計桁数)とスケール(小数桁数)でFLOATカラムを作成します。

$table->float('amount', 8, 2);

foreignId()

foreignIdメソッドはUNSIGNED BIGINTカラムを作成します。

$table->foreignId('user_id');

foreignIdFor()

foreignIdForメソッドは、指定モデルクラスへ{column}_id UNSIGNED BIGINTを追加します。

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

foreignUuid()

foreignUuidメソッドはUUIDカラムを作成します。

$table->foreignUuid('user_id');

geometryCollection()

geometryCollectionメソッドはGEOMETRYCOLLECTIONカラムを作成します。

$table->geometryCollection('positions');

geometry()

geometryメソッドはGEOMETRYカラムを作成します。

$table->geometry('positions');

id()

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

$table->id();

increments()

incrementsメソッドは、主キーとして自動増分のUNSIGNED INTEGERカラムを作成します。

$table->increments('id');

integer()

integerメソッドはINTEGERカラムを作成します。

$table->integer('votes');

ipAddress()

ipAddressメソッドはVARCHARカラムを作成します。

$table->ipAddress('visitor');

json()

jsonメソッドはJSONカラムを作成します。

$table->json('options');

jsonb()

jsonbメソッドはJSONBカラムを作成します。

$table->jsonb('options');

lineString()

lineStringメソッドはLINESTRINGカラムを作成します。

$table->lineString('positions');

longText()

longTextメソッドはLONGTEXTカラムを作成します。

$table->longText('description');

macAddress()

macAddressメソッドは、MACアドレスを保持することを目的としたカラムを作成します。PostgreSQLなどの一部のデータベースシステムには、このタイプのデータ専用のカラムタイプがあります。他のデータベースシステムでは、文字カラムに相当するカラムを使用します。

$table->macAddress('device');

mediumIncrements()

mediumIncrementsメソッドは、主キーが自動増分のUNSIGNED MEDIUMINTカラムを作成します。

$table->mediumIncrements('id');

mediumInteger()

mediumIntegerメソッドはMEDIUMINTカラムを作成します。

$table->mediumInteger('votes');

mediumText()

mediumTextメソッドはMEDIUMTEXTカラムを作成します。

$table->mediumText('description');

morphs()

morphsメソッドは、{column}_id UNSIGNED BIGINTカラムと、{column}_type VARCHARカラムを追加する便利なメソッドです。

このメソッドは、ポリモーフィックEloquentリレーションに必要なカラムを定義するときに使用することを目的としています。次の例では、taggable_idカラムとtaggable_typeカラムが作成されます。

$table->morphs('taggable');

multiLineString()

multiLineStringメソッドはMULTILINESTRINGカラムを作成します。

$table->multiLineString('positions');

multiPoint()

multiPointメソッドはMULTIPOINTカラムを作成します。

$table->multiPoint('positions');

multiPolygon()

multiPolygonメソッドはMULTIPOLYGONカラムを作成します。

$table->multiPolygon('positions');

nullableTimestamps()

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

$table->nullableTimestamps(0);

nullableMorphs()

このメソッドは、morphsメソッドに似ています。ただし、作成するカラムは"NULLABLE"になります。

$table->nullableMorphs('taggable');

nullableUuidMorphs()

このメソッドは、uuidMorphsメソッドに似ています。ただし、作成するカラムは"NULLABLE"になります。

$table->nullableUuidMorphs('taggable');

point()

pointメソッドはPOINTカラムを作成します。

$table->point('position');

polygon()

polygonメソッドはPOLYGONカラムを作成します。

$table->polygon('position');

rememberToken()

rememberTokenメソッドは、現在の「ログイン持続("remember me")」認証トークンを格納することを目的としたNULL許容の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メソッドは、オプションの精度(合計桁数)でNULL許容のdeleted_at TIMESTAMP(タイムゾーン付き)カラムを追加します。このカラムは、Eloquentの「ソフトデリート」機能に必要なdeleted_atタイムスタンプを格納するためのものです。

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

softDeletes()

softDeletesメソッドは、オプションの精度(合計桁数)でNULL許容のdeleted_at TIMESTAMPカラムを追加します。このカラムは、Eloquentの「ソフトデリート」機能に必要なdeleted_atタイムスタンプを格納するためのものです。

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

string()

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

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

text()

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

$table->text('description');

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_at TIMESTAMP(タイムゾーン付き)カラムを作成します。

$table->timestampsTz($precision = 0);

timestamps()

timestampsメソッドは、オプションの精度(合計桁数)でcreated_atおよびupdated_at TIMESTAMPカラムを作成します。

$table->timestamps($precision = 0);

tinyIncrements()

tinyIncrementsメソッドは、主キーとして自動増分のUNSIGNED TINYINTカラムを作成します。

$table->tinyIncrements('id');

tinyInteger()

tinyIntegerメソッドはTINYINTカラムを作成します。

$table->tinyInteger('votes');

tinyText()

TinyTextメソッドはTINYTEXTカラムを作成します。

$table->tinyText('notes');

unsignedBigInteger()

unsignedBigIntegerメソッドはUNSIGNED BIGINTカラムを作成します。

$table->unsignedBigInteger('votes');

unsignedDecimal()

unsignedDecimalメソッドは、オプションの精度(合計桁数)とスケール(小数桁数)を使用して、UNSIGNED DECIMALカラムを作成します。

$table->unsignedDecimal('amount', $precision = 8, $scale = 2);

unsignedInteger()

unsignedIntegerメソッドはUNSIGNED INTEGERカラムを作成します。

$table->unsignedInteger('votes');

unsignedMediumInteger()

unsignedMediumIntegerメソッドは、UNSIGNED MEDIUMINTカラムを作成します。

$table->unsignedMediumInteger('votes');

unsignedSmallInteger()

unsignedSmallIntegerメソッドはUNSIGNED SMALLINTカラムを作成します。

$table->unsignedSmallInteger('votes');

unsignedTinyInteger()

unsignedTinyIntegerメソッドはUNSIGNED TINYINTカラムを作成します。

$table->unsignedTinyInteger('votes');

uuidMorphs()

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

このメソッドは、UUID識別子を使用するポリモーフィックなEloquentリレーションに必要なカラムを定義するときに使用します。以下の例では、taggable_idカラムとtaggable_typeカラムが作成されます。

$table->uuidMorphs('taggable');

uuid()

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') カラムの照合順序を指定(MySQL/PostgreSQL/SQL Server)
->comment('my comment') カラムにコメントを追加(MySQL/PostgreSQL)
->default($value) カラムの「デフォルト」値を指定
->first() テーブルの「最初の」カラムを配置(MySQL)
->from($integer) 自動増分フィールドの開始値を設定(MySQL/PostgreSQL)
->invisible() SELECT *クエリに対しカラムを「不可視」にする(MySQL)
->nullable($value = true) NULL値をカラムに保存可能に設定
->storedAs($expression) stored generatedカラムを作成(MySQL/PostgreSQL)
->unsigned() INTEGERカラムをUNSIGNEDとして設定(MySQL)
->useCurrent() CURRENT_TIMESTAMPをデフォルト値として使用するようにTIMESTAMPカラムを設定
->useCurrentOnUpdate() レコードが更新されたときにCURRENT_TIMESTAMPを使用するようにTIMESTAMPカラムを設定
->virtualAs($expression) virtual generatedカラムを作成(MySQL)
->generatedAs($expression) 指定のシーケンスオプションで、識別カラムを生成(PostgreSQL)
->always() IDカラムの入力に対するシーケンス値の優先順位を定義(PostgreSQL)
->isGeometry() 空間カラムのタイプをgeometryに設定 - デフォルトタイプはgeography(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;

class CreateFlightsTable extends Migration
{
    /**
     * マイグレーションの実行
     *
     * @return void
     */
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->json('movies')->default(new Expression('(JSON_ARRAY())'));
            $table->timestamps();
        });
    }
}

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

カラム順序

MySQLデータベースを使用するときは、スキーマ内の既存の列の後に列を追加するためにafterメソッドを使用できます。

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

カラムの変更

前提条件

カラムを変更する前に、Composerパッケージマネージャーを使用してdoctrine/dbalパッケージをインストールする必要があります。DoctrineDBALライブラリは、カラムの現在の状態を判別し、カラムに要求された変更を加えるために必要なSQLクエリを作成するのに使用します。

composer require doctrine/dbal

timestampメソッドを使用して作成したカラムを変更する予定があるときは、アプリケーションのconfig/database.php設定ファイルに以下の設定を追加する必要があります。

use Illuminate\Database\DBAL\TimestampType;

'dbal' => [
    'types' => [
        'timestamp' => TimestampType::class,
    ],
],

Note: アプリケーションでMicrosoft SQL Serverを使用している場合は、doctrine/dbal:^3.0を確実にインストールしてください。

カラム属性の更新

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

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

カラムをNULLABLEへ変更することもできます。

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

Note: 以降のカラムタイプを変更できます。bigIntegerbinarybooleandatedateTimedateTimeTzdecimalintegerjsonlongTextmediumTextsmallIntegerstringtexttimeunsignedBigIntegerunsignedIntegerunsignedSmallIntegeruuidtimestampのカラムタイプを変更するには、Doctrineタイプを登録する必要があります

カラムのリネーム

カラムをリネームするには、スキーマビルダBlueprintが提供するrenameColumnメソッドを使用します。カラムの名前を変更する前に、Composerパッケージマネージャーを介してdoctrine/dbalライブラリをインストールしていることを確認してください。

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

Note: enumカラムの名前変更は現在サポートしていません。

カラムの削除

カラムを削除するには、スキーマビルダのBlueprintでdropColumnメソッドを使用します。アプリケーションがSQLiteデータベースを利用している場合、dropColumnメソッドを使用する前に、Composerパッケージマネージャーを介してdoctrine/dbalパッケージをインストールする必要があります。

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

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

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

Note: SQLiteデータベースの使用時に、1回のマイグレーションで複数のカラムを削除または変更することはサポートしていません。

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

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()メソッドのエイリアス

インデックス

インデックスの生成

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

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

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

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

$table->unique('email');

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

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

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

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

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

LaravelのスキーマビルダBlueprintクラスは、Laravelでサポートしている各タイプのインデックスを作成するメソッドを提供しています。各indexメソッドは、オプションの2番目の引数を取り、インデックスの名前を指定します。省略した場合、名前は、インデックスに使用されるテーブルとカラムの名前、およびインデックスタイプから派生します。使用可能な各インデックスメソッドは、以下の表で説明します。

コマンド 説明
$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を除く)

インデックスの長さとMySQL/MariaDB

デフォルトでは、Laravelはutf8mb4文字セットを使用します。5.7.7リリースより古いバージョンのMySQLまたは10.2.2リリースより古いMariaDBを実行している場合、MySQLがそれらのインデックスを作成するために、マイグレーションによって生成されるデフォルトの文字カラム長を手動で設定する必要が起きます。App\Providers\AppServiceProviderクラスのbootメソッド内でSchema::defaultStringLengthメソッドを呼び出し、デフォルトの文字カラムの長さを設定できます。

use Illuminate\Support\Facades\Schema;

/**
 * 全アプリケーションサービスの初期設定
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191);
}

または、データベースのinnodb_large_prefixオプションを有効にすることもできます。このオプションを適切に有効にする方法については、データベースのドキュメントを参照してください。

インデックスのリネーム

インデックスの名前を変更するには、スキーマビルダBlueprintが提供するrenameIndexメソッドを使用します。このメソッドは、現在のインデックス名を最初の引数として取り、目的の名前を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->dropSpatialIndex('geo_location_spatialindex'); "geo"テーブルから空間インデックスを削除(SQLiteを除く)

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

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

外部キー制約

Laravelは、データベースレベルで参照整合性を強制するために使用される外部キー制約の作成もサポートしています。たとえば、usersテーブルのidカラムを参照するpostsテーブルの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('users');
});

必要なアクションに"on delete"や"on update"の制約プロパティを指定することもできます。

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

これらのアクションには、表現力のある別構文も用意しています。

メソッド 説明
$table->cascadeOnUpdate(); 更新をカスケードします。
$table->restrictOnUpdate(); 更新を制限します。
$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();

Note: SQLiteは、デフォルトで外部キー制約を無効にします。SQLiteを使用する場合は、マイグレーションでデータベースを作成する前に、データベース設定の外部キーサポートを有効にするを確実に行ってください。さらに、SQLiteはテーブルの作成時にのみ外部キーをサポートし、テーブルを変更する場合はサポートしません

イベント

便宜上、各マイグレート操作はイベントを発行します。以下のイベントはすべて、Illuminate\Database\Events\MigrationEvent基本クラスを継承しています。

Class Description
Illuminate\Database\Events\MigrationsStarted マイグレーションのバッチが実行されようとしています。
Illuminate\Database\Events\MigrationsEnded マイグレーションのバッチが実行終了しました。
Illuminate\Database\Events\MigrationStarted 単一マイグレーションが実行されようとしています。
Illuminate\Database\Events\MigrationEnded 単一マイグレーションが実行完了しました。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる