イントロダクション
マイグレーションはデータベースのバージョン管理のようなもので、チームがアプリケーションのデータベーススキーマを定義および共有できるようにします。ソース管理から変更を取得した後に、ローカルデータベーススキーマにカラムを手動で追加するようにチームメートに指示する必要があったことを経験していれば、データベースのマイグレーションにより解決される問題に直面していたのです。
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データベースへ復元されない場合があります。
マイグレーションの構造
移行クラスには、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;
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
プロパティとcollation
プロパティは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: 以降のカラムタイプを変更できます。
bigInteger
、binary
、boolean
、date
、dateTime
、dateTimeTz
、decimal
、integer
、json
、longText
、mediumText
、smallInteger
、string
、text
、time
、unsignedBigInteger
、unsignedInteger
、unsignedSmallInteger
、uuid
。timestamp
のカラムタイプを変更するには、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 |
単一マイグレーションが実行完了しました。 |