Database: Migrations
Table of Contents
Introduction
Migrations は、あなたの database に対するバージョンコントロールのようなもので、チームがアプリケーションの database schema 定義を定義し共有することを可能にします。ソースコントロールから変更を引き込んだ後に、チームメイトに手動で column をローカルの database schema に追加するよう指示したことがあるなら、あなたは database migrations が解決する問題に直面していることでしょう。
Laravel のSchemafacadeは、Laravel がサポートするすべての database システムでテーブルを作成し操作するための、database に依存しないサポートを提供します。通常、migrations はこの facade を使用して、database のテーブルと列を作成し、変更します。
Generating Migrations
make:migration Artisan commandを使用して database のマイグレーションを生成することができます。新しいマイグレーションはあなたのdatabase/migrationsディレクトリに配置されます。各マイグレーションのファイル名には、 Laravel が migrations の順序を決定するための timestamp が含まれています:
php artisan make:migration create_flights_table
Laravel は、マイグレーションの名前を使用して、マイグレーションが新しいテーブルを作成するかどうか、そしてテーブルの名前を attempt で推測します。もし Laravel がマイグレーション名からテーブル名を判断できた場合、 Laravel は生成されたマイグレーションファイルに指定したテーブルを事前に記入します。それ以外の場合は、手動でマイグレーションファイルにテーブルを指定することもできます。
生成されたマイグレーションのための custom path を指定したい場合は、make:migration command を実行する際に--pathオプションを使用できます。指定する path は、アプリケーションのベース path に対する相対パスであるべきです。
NOTE
マイグレーションのスタブはstub publishingを使用してカスタマイズすることができます。
Migrations の統合
あなたが application を build していくと、時間とともにますます多くの migrations が溜まっていくかもしれません。これにより、database/migrationsディレクトリが数百もの migrations で肥大化する可能性があります。もしご希望であれば、 migrations を single の SQL ファイルに"squash"することができます。始めるには、schema:dump command を実行してください。
php artisan schema:dump
# Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune
この command を実行すると、Laravel は "schema" ファイルを application の database/schema ディレクトリに書き込みます。 schema ファイルの名前は、使用する database connection に対応します。これで、あなたが database を migrate しようと attempt し、他の migrations が実行されていない場合、Laravel は最初に、使用している database connection の schema ファイルの SQL 文を実行します。 schema ファイルの SQL 文を実行した後、Laravel は、schema dump の一部ではなかった残りの migrations を実行します。
アプリケーションのテストが、通常のローカル開発時に使用するものとは異なる database connection を使用している場合は、テストが database を build できるように、その database connection を使用して schema ファイルをダンプしたことを確認する必要があります。これは、通常のローカル開発時に使用する database connection をダンプした後に行うことをお勧めします:
php artisan schema:dump
php artisan schema:dump --database=testing --prune
あなたは、チームの他の新しい開発者があなたのアプリケーションの初期の database 構造を素早く作成できるように、 database schema ファイルをソースコントロールにコミットすべきです。
WARNING
マイグレーションのスカッシュは、 MySQL 、PostgreSQL、および SQLite データベースのみで利用可能であり、データベースのコマンドライン client を利用します。
Migration Structure
migration の class は 2 つのメソッドを含んでいます:upとdownです。upの method は新しいテーブル、列、またはインデックスをあなたの database に追加するために使用され、一方でdownの method はupの method で実行された操作を逆にするべきです。
これらの両方の方法で、明快にテーブルを作成および変更するために Laravel schema ビルダーを使用することができます。 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 の移行設定
あなたのマイグレーションがアプリケーションの default database connection 以外の database connection とやり取りする場合、マイグレーションの $connection プロパティを設定する必要があります。
/**
* The database connection that should be used by the migration.
*
* @var string
*/
protected $connection = 'pgsql';
/**
* Run the migrations.
*/
public function up(): void
{
// ...
}
Running Migrations
全ての未終了の migrations を実行するには、migrate Artisan command を実行します:
php artisan migrate
これまでにどの migrations が実行されたかを見たい場合、migrate:status Artisan command を使用することができます:
php artisan migrate:status
migrations が実際に実行することなく、将来実行される SQL 文を確認したい場合は、migrateの--pretendフラグを提供できます。
php artisan migrate --pretend
マイグレーション実行の分離
あなたが複数のサーバーに application をデプロイし、 deployment process の一部として migrations を実行している場合、2 つのサーバーが同時に database への migrate を試みることは望ましくないでしょう。これを避けるために、migrate command を呼び出すときに isolated オプションを使用することができます。
isolatedオプションが提供されると、 Laravel はあなたのアプリケーションの cache driver を使用してアトミックロックを獲得し、その後に migrations を実行しようとします。そのロックが保持されている間に他のすべての試みがmigrate command を実行することはありません;しかし、 command はそれでも成功した終了 status code で終了します。
php artisan migrate --isolated
WARNING
この feature を利用するためには、あなたの application は
database、memcached、dynamodb、またはrediscache driver をアプリケーションの default cache driver として使用している必要があります。さらに、すべてのサーバーは同じ中央の cache サーバーと通信している必要があります。
Migrations を Production で実行するための強制
一部の migration 操作は破壊的であり、つまり data を失う可能性があります。これらの commands があなたの production database に対して実行される前に、確認のための prompt が表示されます。prompt なしで commands を強制的に実行するには、--forceフラグを使用してください。
php artisan migrate --force
Migrations のロールバック
最新のマイグレーション操作を元に戻すには、rollback Artisan command を使用することができます。この command は、最後の"batch"の migrations を元に戻します。これには複数のマイグレーションファイルが含まれる場合があります:
php artisan migrate:rollback
限られた数の migrations をロールバックすることができます。それには、rollback command にstepオプションを指定します。例えば、以下の command は最後の 5 つの migrations をロールバックします:
php artisan migrate:rollback --step=5
batchoption をrollback command に提供することで、特定の"batch"の migrations をロールバックすることができます。ここで、batchoption は、application のmigrations database テーブル内の batch value に対応します。例えば、以下の command は、batch3 のすべての migrations をロールバックします:
php artisan migrate:rollback --batch=3
migrate:rollbackの--pretendフラグを提供することで、実際に実行せずに migrations によって実行される SQL 文を表示したい場合:
php artisan migrate:rollback --pretend
migrate:resetの command は、application のすべての migrations をロールバックします:
php artisan migrate:reset
ロールバックと Migrate を Single Command を使用して行う
migrate:refreshの command は、すべての migrations をロールバックし、その後migrateの command を実行します。この command は、実質的にあなたの全ての database を再作成します。
php artisan migrate:refresh
# Refresh the database and run all database seeds...
php artisan migrate:refresh --seed
stepoption をrefreshの command に提供することで、限定された数の migrations をロールバックし、再マイグレートすることができます。例えば、以下の command は最後の 5 つの migrations をロールバックし、再マイグレーションします:
php artisan migrate:refresh --step=5
すべてのテーブルをドロップし、 Migrate
migrate:fresh command は、すべてのテーブルを database から削除した後、migrate command を実行します。
php artisan migrate:fresh
php artisan migrate:fresh --seed
default では、migrate:fresh command は default の database 接続からのみテーブルをドロップします。しかし、--database option を使用して移行すべき database 接続 を指定することもできます。 database 接続名は、application の database 設定ファイルで定義された 接続 に対応しているべきです。
php artisan migrate:fresh --database=admin
WARNING
migrate:freshcommand は、プレフィックスに関係なくすべての database テーブルを削除します。 他の application と database を共有して development している場合、この command は慎重に使用する必要があります。
Tables
テーブルの作成
新しい database テーブルを作成するには、 Schema facade 上の create method を使用します。 create method は 2 つの引数を受け取ります。一つ目はテーブルの名前で、二つ目は新しいテーブルを定義するために使用される Blueprint object を受け取るクロージャです。
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();
});
テーブルを作成する際には、 schema ビルダーの“ column メソッドを使ってテーブルの列を定義することができます。
テーブル / Column の存在を確認する
hasTable、hasColumn、およびhasIndexメソッドを使用して、テーブル、 column 、またはインデックスの存在を確認することができます。
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...
}
Database Connection とテーブル Options
あなたがアプリケーションの default connection でない database connection に対して schema 操作を実行したい場合は、connection method を使用してください:
Schema::connection('sqlite')->create('users', function (Blueprint $table) {
$table->id();
});
さらに、テーブルの作成に関連する他の側面を定義するために、いくつかの他のプロパティやメソッドを使用することができます。engineプロパティは、 MySQL を使用してテーブルの storage エンジンを指定するために使用することができます。
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 method は、テーブルが"temporary"であることを示すために使用できます。一時テーブルは現在の接続の database session にのみ表示され、connection が閉じられると自動的に削除されます:
Schema::create('calculations', function (Blueprint $table) {
$table->temporary();
// ...
});
"comment"を database テーブルに追加したい場合は、テーブルインスタンスに対して comment method を呼び出すことができます。テーブル comments は現在、MySQL と PostgreSQL のみがサポートされています:
Schema::create('calculations', function (Blueprint $table) {
$table->comment('Business calculations');
// ...
});
テーブルの更新
Schemaの facade 上のtableの method は、既存のテーブルを update するために使用することができます。createの method 同様に、tableの method は二つの引数を受け付けます:テーブルの名前と、テーブルに列やインデックスを追加するために使用できるBlueprintインスタンスを受け取るクロージャです:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});
テーブルの名前変更 / 削除
既存の database テーブルの名前を変更するには、rename method を使用します:
use Illuminate\Support\Facades\Schema;
Schema::rename($from, $to);
既存のテーブルを削除するには、dropまたはdropIfExistsメソッドを使用できます:
Schema::drop('users');
Schema::dropIfExists('users');
外部の Keys を使用してテーブルの名前を変更する
テーブルの名前を変更する前に、テーブルの外部キー制約が、 Laravel が規則に基づいて名前を割り当てるのではなく、マイグレーションファイルで明示的な名前を持っていることを確認するべきです。そうでなければ、外部キー制約の名前は古いテーブル名を参照することになります。
Columns
列の作成
Schemaの facade であるtableの method は、既存のテーブルを update するために使用することができます。 createの method と同様に、tableの method は 2 つの引数を受け入れます:テーブルの名前と、テーブルに列を追加するために使用できるIlluminate\Database\Schema\Blueprintインスタンスを受け取るクロージャです:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});
利用可能な Column タイプ
schema ビルダーブループリントは、 database のテーブルに追加できるさまざまなタイプの列に対応する様々なメソッドを提供します。利用可能なメソッドは下記の表に列挙されています。
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 method は、オートインクリメントの UNSIGNED BIGINT ( primary key)に相当する column を作成します:
$table->bigIncrements('id');
bigInteger()
bigIntegerの method は、BIGINT相当の column を作成します:
$table->bigInteger('votes');
binary()
binary method は、BLOB相当の column を作成します:
$table->binary('photo');
MySQL 、 MariaDB 、または SQL Server を使用する場合、lengthとfixedの引数を渡して VARBINARYまたはBINARYに相当する column を作成できます。
$table->binary('data', length: 16); // VARBINARY(16)
$table->binary('data', length: 16, fixed: true); // BINARY(16)
boolean()
BOOLEAN method は、boolean相当の column を作成します:
$table->boolean('confirmed');
char()
CHAR method は、指定された length のchar相当の column を作成します。
$table->char('name', length: 100);
dateTimeTz()
dateTimeTz method は、option の小数点以下の精度でのDATETIME( timezone 付き)と同等の column を作成します:
$table->dateTimeTz('created_at', precision: 0);
dateTime()
DATETIME method は、option の小数秒精度を持つdateTime相当の column を作成します:
$table->dateTime('created_at', precision: 0);
date()
DATE method は、dateと同等の column を作成します:
$table->date('created_at');
decimal()
DECIMAL method は、指定された精度(全桁数)とスケール(小数点以下の桁数)を持つdecimal相当の column を作成します:
$table->decimal('amount', total: 8, places: 2);
double()
DOUBLEの method は、double相当の column を作成します:
$table->double('amount');
enum()
ENUM method は、与えられた有効な values でenumと同等の column を作成します:
$table->enum('difficulty', ['easy', 'hard']);
float()
FLOAT method は、指定した精度で float 相当の column を作成します:
$table->float('amount', precision: 53);
foreignId()
foreignId method は、UNSIGNED BIGINTと同等の column を作成します:
$table->foreignId('user_id');
foreignIdFor()
foreignIdFor method は、指定された model class に対して{column}_id相当の column を追加します。 column type は、 model の key type によりUNSIGNED BIGINT、CHAR(36)、またはCHAR(26)になります。
$table->foreignIdFor(User::class);
foreignUlid()
foreignUlid method は、ULIDと同等の column を作成します:
$table->foreignUlid('user_id');
foreignUuid()
foreignUuid method は、UUIDと同等の column を作成します:
$table->foreignUuid('user_id');
geography()
GEOGRAPHY method は、指定された空間 type および SRID(Spatial Reference System Identifier)を持つgeography相当の column を作成します:
$table->geography('coordinates', subtype: 'point', srid: 4326);
NOTE
空間型のサポートは、あなたの database driver に依存します。データベースのドキュメントを参照してください。もし、あなたの application が PostgreSQL の database を使用している場合は、
geographyの method が使用可能になる前に、PostGIS の拡張をインストールする必要があります。
geometry()
GEOMETRY method は、指定された空間 type と SRID(空間参照システム識別子)を使用して、geometryと同等の column を作成します:
$table->geometry('positions', subtype: 'point', srid: 0);
NOTE
空間型のサポートは、あなたの database driver に依存します。データベースのドキュメンテーションを参照してください。もし、あなたの application が PostgreSQL の database を使用している場合、
geometrymethod を使用する前にPostGIS 拡張機能をインストールする必要があります。
id()
id method は、bigIncrements method の別名です。 default では、この method はid列を作成しますが、列に別の名前を付けたい場合は、列名を渡すこともできます。
$table->id();
increments()
increments method は、 primary key として自動インクリメントするUNSIGNED INTEGER相当の column を作成します。
$table->increments('id');
integer()
INTEGER method は、integer相当の column を作成します。
$table->integer('votes');
ipAddress()
ipAddress method は、VARCHARに相当する column を作成します:
$table->ipAddress('visitor');
PostgreSQL を使用するとき、INET column が作成されます。
json()
JSON method はjsonが対応する column を作成します:
$table->json('options');
jsonb()
JSONB method はjsonb相当の column を作成します:
$table->jsonb('options');
longText()
LONGTEXT method は、longTextと同等な column を作成します。
$table->longText('description');
MySQL または MariaDB を使用する際に、LONGBLOB相当の column を作成するために、binaryキャラクターセットを column に適用することができます:
$table->longText('data')->charset('binary'); // LONGBLOB
macAddress()
macAddress 方法は、MAC アドレスを保持することを目的とした列を作成します。PostgreSQL のような database システムでは、この type の data のための専用の列 type があります。他の database システムでは、string に相当する列を使用します。
$table->macAddress('device');
mediumIncrements()
mediumIncrementsの method は、 primary key としての自動インクリメントUNSIGNED MEDIUMINT相当の column を作成します:
$table->mediumIncrements('id');
mediumInteger()
mediumInteger method は、MEDIUMINTと同等の column を作成します:
$table->mediumInteger('votes');
mediumText()
MEDIUMTEXT method は、mediumTextに相当する column を作成します。
$table->mediumText('description');
MySQL や MariaDB を利用する際、 column にbinary文字セットを適用してMEDIUMBLOB相当の column を作成することができます:
$table->mediumText('data')->charset('binary'); // MEDIUMBLOB
morphs()
morphs method は、{column}_id相当の column と{column}_type VARCHAR相当の column を追加する便利な method です。 {column}_idの column type は、 model key の type によってUNSIGNED BIGINT、CHAR(36)、またはCHAR(26)になります。
この method は、ポリモーフィックなEloquent 関係に必要な列を定義する際に使用することを目的としています。以下の例では、taggable_id と taggable_type の列が作成されます:
$table->morphs('taggable');
nullableTimestamps()
nullableTimestamps method はtimestamps method の alias です:
$table->nullableTimestamps(precision: 0);
nullableMorphs()
「'' method ''メソッドは、morphsメソッドと似ています。ただし、作成されるカラムは"nullable"となります」
$table->nullableMorphs('taggable');
nullableUlidMorphs()
method はulidMorphsメソッドと同様です。ただし、作成される列は"nullable"になります。
$table->nullableUlidMorphs('taggable');
nullableUuidMorphs()
method はuuidMorphsメソッドと似ていますが、作成されたカラムは"nullable"となります。
$table->nullableUuidMorphs('taggable');
rememberToken()
rememberToken method は、現在の "remember me" authenticationtoken を保存することを目的とした、null 許容の VARCHAR(100) 相当の column を作成します。
$table->rememberToken();
set()
SET method は、与えられた有効な values のリストと同等のset column を作成します:
$table->set('flavors', ['strawberry', 'vanilla']);
smallIncrements()
smallIncrements method は、 primary key としての自動増分 UNSIGNED SMALLINT 相当の column を作成します:
$table->smallIncrements('id');
smallInteger()
smallInteger method は、SMALLINTに相当する column を作成します。
$table->smallInteger('votes');
softDeletesTz()
softDeletesTz method は、option で小数点以下の秒を持つヌル可能なdeleted_at TIMESTAMP(タイムゾーン付き)と同等の column を追加します。この column は、Eloquent の"soft delete"機能に必要なdeleted_at timestamp を保存するためのものです。
$table->softDeletesTz('deleted_at', precision: 0);
softDeletes()
softDeletes method は、option の小数秒精度を持つdeleted_at TIMESTAMPと等しい nullable の列を追加します。この列は、Eloquent の"soft delete"機能に必要なdeleted_at timestamp を格納するためのものです。
$table->softDeletes('deleted_at', precision: 0);
string()
string method は指定した length のVARCHAR相当の column を作成します:
$table->string('name', length: 100);
text()
TEXT method は、text相当の column を作成します:
$table->text('description');
MySQL または MariaDB を利用する際に、BLOB相当の column を作成するために、binaryキャラクターセットを column に適用することができます:
$table->text('data')->charset('binary'); // BLOB
timeTz()
timeTz method は、option の小数秒精度を持つTIME ( timezone 付き)と同等の column を作成します:
$table->timeTz('sunrise', precision: 0);
time()
TIME method は、option の小数点以下の秒の精度を持つtime相当の column を作成します:
$table->time('sunrise', precision: 0);
timestampTz()
timestampTz method は、option の小数点以下の秒数精度を持つTIMESTAMP( timezone 付き)と同等の column を作成します:
$table->timestampTz('added_at', precision: 0);
timestamp()
TIMESTAMP method は、option の小数秒精度を持つtimestamp相当の column を作成します:
$table->timestamp('added_at', precision: 0);
timestampsTz()
timestampsTz method は、option で小数秒の精度を持つ、タイムゾーン付きのcreated_atおよびupdated_at TIMESTAMP相当の列を作成します。
$table->timestampsTz(precision: 0);
timestamps()
timestamps method は、オプションで小数点以下の秒の精度を持つcreated_atとupdated_atのTIMESTAMP相当のカラムを作成します:
$table->timestamps(precision: 0);
tinyIncrements()
tinyIncrements method は、オートインクリメントのUNSIGNED TINYINT相当の column を primary key として生成します:
$table->tinyIncrements('id');
tinyInteger()
tinyInteger method は、TINYINT相当の column を作成します:
$table->tinyInteger('votes');
tinyText()
TINYTEXT method は、tinyText相当の column を作成します。
$table->tinyText('notes');
MySQL や MariaDB を利用する際には、TINYBLOB相当の column を作成するために、 column にbinary文字セットを適用することができます:
$table->tinyText('data')->charset('binary'); // TINYBLOB
unsignedBigInteger()
unsignedBigIntegerの method はUNSIGNED BIGINTに相当する column を作成します:
$table->unsignedBigInteger('votes');
unsignedInteger()
unsignedInteger method は、UNSIGNED INTEGER相当の column を作成します:
$table->unsignedInteger('votes');
unsignedMediumInteger()
unsignedMediumInteger method は、UNSIGNED MEDIUMINTに相当する column を作成します:
$table->unsignedMediumInteger('votes');
unsignedSmallInteger()
unsignedSmallInteger method は、UNSIGNED SMALLINTに相当する column を作成します:
$table->unsignedSmallInteger('votes');
unsignedTinyInteger()
unsignedTinyIntegerの method は、UNSIGNED TINYINTに相当する column を作成します:
$table->unsignedTinyInteger('votes');
ulidMorphs()
ulidMorphs method は、{column}_id CHAR(26)相当の column と{column}_type VARCHAR相当の column を追加する便利な method です。
この method は、 ULID 識別子を使用した多相性のEloquent リレーションシップに必要な列を定義する際に使用することを意図しています。次の例では、taggable_idとtaggable_typeの列が作成されます:
$table->ulidMorphs('taggable');
uuidMorphs()
uuidMorphs method は、{column}_id CHAR(36)相当の column と{column}_type VARCHAR相当の column を追加する便利な method です。
この method は、 UUID 識別子を使用する多態性のEloquent 関係に必要な列を定義する際に使用することを目的としています。以下の例では、taggable_idとtaggable_typeの列が作成されます:
$table->uuidMorphs('taggable');
ulid()
ULID method は、ulid 相当の column を作成します:
$table->ulid('id');
uuid()
UUID method は、uuid相当の column を作成します:
$table->uuid('id');
year()
YEAR method は、yearに相当する column を作成します。
$table->year('birth_year');
Column モディファイア
上記の column タイプに加えて、database テーブルに column を追加する際に使用できるいくつかの column 「修飾子」があります。たとえば、column を「null 許容」にするには、nullable method を使用します:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});
次の表には、利用可能なすべての column 修飾子が含まれています。このリストにはindex modifiersは含まれていません:
| 修飾子 | 説明 |
|---|---|
->after('column') | column の "after" をもう一つの column に配置します( MySQL )。 |
->autoIncrement() | INTEGER 列を自動インクリメント( primary キー)に設定します。 |
->charset('utf8mb4') | column ( MySQL )の文字セットを指定します。 |
->collation('utf8mb4_unicode_ci') | column に対して照合順序を指定します。 |
->comment('my comment') | column に comment を追加します( MySQL / PostgreSQL)。 |
->default($value) | column に対する"デフォルト"の value を指定します。 |
->first() | column を"first"に配置し、テーブル( MySQL )内に表示します。 |
->from($integer) | 自動インクリメントフィールドの開始 value を設定します( MySQL / PostgreSQL)。 |
->invisible() | "invisible" を使用して column を SELECT * クエリから "見えなく" します( MySQL ")。 |
->nullable($value = true) | NULLvalues を列に挿入できるように許可します。 |
->storedAs($expression) | ストアド生成された column ( MySQL / PostgreSQL / SQLite)を作成します。 |
->unsigned() | INTEGER カラムを UNSIGNED ( MySQL )として設定します。 |
->useCurrent() | TIMESTAMP 列を、default values として CURRENT_TIMESTAMP を使用するように設定します。 |
->useCurrentOnUpdate() | レコードが更新されたときに、 TIMESTAMP 列に CURRENT_ TIMESTAMP を使用するように設定します( MySQL )。 |
->virtualAs($expression) | column という仮想生成( MySQL / SQLite)を作成します。 |
->generatedAs($expression) | 指定された sequence options を使用して、アイデンティティの column を作成します(PostgreSQL)。 |
->always() | これは、識別用の column (PostgreSQL)に対し、 sequence values が input より優先されることを定義します。 |
Default 式
default修飾子は、 value またはIlluminate\Database\Query\Expressionインスタンスを受け入れます。Expressionインスタンスを使用すると、 Laravel が value を引用符で囲むのを防ぎ、 database 特有の関数を使用できるようになります。これが特に有用な状況の一つは、 JSON 列に default values を割り当てる必要がある場合です:
<?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();
});
}
};
WARNING
default 式のサポートは、ご使用の database driver と database のバージョン、そしてフィールドの type によります。詳細については、データベースのドキュメンテーションをご参照ください。
Column の順番
MySQL database を使用する際、after method を使用して、schema の既存の column の後に column を追加することができます:
$table->after('password', function (Blueprint $table) {
$table->string('address_line1');
$table->string('address_line2');
$table->string('city');
});
列の変更
change method を使用すると、既存の column の type や属性を変更することができます。たとえば、stringcolumn のサイズを増やしたい場合があります。change method の action を見るために、namecolumn のサイズを 25 から 50 に増やしてみましょう。これを達成するためには、column の新しい状態を定義し、その後でchange method を呼び出すだけです:
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});
column を変更する際には、 column の定義に保持したいすべての変更を明示的に含める必要があります - すべての attribute が省略されると削除されます。例えば、unsigned、default、およびcomment attributes を保持するためには、 column を変更する際にそれぞれのモディファイヤを明示的に呼び出す必要があります。
Schema::table('users', function (Blueprint $table) {
$table->integer('votes')->unsigned()->default(1)->comment('my comment')->change();
});
change method は、 column のインデックスを変更しません。したがって、 column を変更するときにインデックスを明示的に追加または削除するためにインデックス修飾子を使用することができます。
// Add an index...
$table->bigIncrements('id')->primary()->change();
// Drop an index...
$table->char('postal_code', 10)->unique(false)->change();
カラムの名前変更
column の名前を変更するには、 schema ビルダーが提供するrenameColumnの method を使用することができます:
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
列の削除
dropColumnを使うと、schema ビルダー上で column を削除することができます:
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});
テーブルから複数のカラムを削除するには、dropColumn method に column 名の array を渡すことができます。
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});
利用可能な Command Aliases
Laravel は一般的なタイプの列を削除する関連の便利な方法をいくつか提供しています。これらの方法は以下の表で説明されています:
| Command | 説明 |
|---|---|
$table->dropMorphs('morphable'); | morphable_id と morphable_type のカラムを削除します。 |
$table->dropRememberToken(); | remember_token column を削除する。 |
$table->dropSoftDeletes(); | deleted_at column を削除します。 |
$table->dropSoftDeletesTz(); | dropSoftDeletes()の method のエイリアスです。 |
$table->dropTimestamps(); | created_atとupdated_atのカラムを削除します。 |
$table->dropTimestampsTz(); | dropTimestamps() method のエイリアス。 |
Indexes
インデックスの作成
Laravel schema ビルダーは、いくつかの types のインデックスをサポートしています。次の例では、新しいemail column を作成し、その values が unique であるべきことを指定します。インデックスを作成するためには、unique method を column の定義に連結することができます:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->string('email')->unique();
});
または、column を定義した後にインデックスを作成することもできます。そのためには、schema ビルダーブループリントで unique method を呼び出す必要があります。この method は、unique インデックスを受け取るべき column の名前を受け取ります:
$table->unique('email');
複合(またはコンポジット)インデックスを作成するために、 method に列の array を渡すことさえ可能です:
$table->index(['account_id', 'created_at']);
インデックスを作成するとき、 Laravel は自動的にテーブル、 column の名前、そしてインデックスの type に基づいてインデックス名を生成しますが、自分でインデックス名を指定するために、 method に 2 つ目の引数を渡すことができます:
$table->unique('email', 'unique_email');
利用可能なインデックスタイプ
Laravel の'schema'ビルダーのブループリント'class'は、'Laravel'によってサポートされている各'type'のインデックスを作成するための method を提供します。各インデックス'method'は、インデックスの名前を指定するための option の 2 番目の引数を受け入れます。省略された場合、名前はインデックスに使用されるテーブルと column(s)の名前、およびインデックス'type'から派生します。利用可能なインデックス method それぞれは以下の表で説明されています:
| Command | 説明 |
|---|---|
$table->primary('id'); | primary キーを追加します。 |
$table->primary(['id', 'parent_id']); | 複合キー keys を追加します。 |
$table->unique('email'); | unique インデックスを追加します。 |
$table->index('state'); | インデックスを追加します。 |
$table->fullText('body'); | フルテキストインデックス( MySQL / PostgreSQL)を追加します。 |
$table->fullText('body')->language('english'); | 指定された言語の全文検索インデックスを追加します(PostgreSQL)。 |
$table->spatialIndex('location'); | 空間インデックスを追加します(SQLite を除く)。 |
インデックスの名前変更
インデックスの名前を変更するには、renameIndex method を提供する schema ビルダーブループリントを使用することができます。この method は、最初の引数に現在のインデックス名を、二つ目の引数に希望する名前を受け入れます:
$table->renameIndex('from', 'to')
インデックスの削除
インデックスを削除するには、インデックス名を指定する必要があります。 default では、 Laravel はテーブル名、索引化された column の名前、インデックスの type に基づいてインデックス名を自動的に割り当てます。以下にいくつかの例を示します。
| Command | 説明 |
|---|---|
$table->dropPrimary('users_id_primary'); | "users"テーブルから primary キーを削除します。 |
$table->dropUnique('users_email_unique'); | "users" テーブルから unique インデックスを削除します。 |
$table->dropIndex('geo_state_index'); | "geo"テーブルから基本的なインデックスを削除します。 |
$table->dropFullText('posts_body_fulltext'); | "posts"テーブルから全文検索インデックスを削除します。 |
$table->dropSpatialIndex('geo_location_spatialindex'); | "geo"テーブルから空間インデックスを削除します(SQLite を除く)。 |
インデックスを削除する method に array のカラムを渡すと、テーブル名、カラム、インデックスの type に基づいて従来のインデックス名が生成されます:
Schema::table('geo', function (Blueprint $table) {
$table->dropIndex(['state']); // Drops index 'geo_state_index'
});
外部キー制約
Laravel は、外部 key 制約の作成にも対応しています。これは、 database レベルで参照 integrity を強制するために使用されます。例えば、 posts テーブルに user_id column を定義し、それがusersテーブルの id column を参照するようにしましょう:
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');
});
この syntax はかなり冗長なので、 Laravel は規約を使用してより良い開発者体験を提供する、追加の簡潔なメソッドを提供します。foreignId method を使用して column を作成する場合、上記の例は次のように書き換えることができます。
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained();
});
foreignId method は、UNSIGNED BIGINTに相当する column を作成し、一方でconstrained method は、参照されるテーブルと column を決定するための規約を使用します。あなたのテーブル名が Laravel の規約と match しない場合は、constrained method にそれを手動で提供することができます。また、生成されるインデックスに付けるべき名前も指定することができます:
Schema::table('posts', function (Blueprint $table) {
$table->foreignId('user_id')->constrained(
table: 'users', indexName: 'posts_user_id'
);
});
また、制約の "on delete" と "on update" プロパティの望ましい " action " を指定することもできます。
$table->foreignId('user_id')
->constrained()
->onUpdate('cascade')
->onDelete('cascade');
これらのアクションについては、代替的で表現豊かな syntax も提供されています:
| Method | 説明 |
|---|---|
$table->cascadeOnUpdate(); | 更新はカスケード式にすべきです。 |
$table->restrictOnUpdate(); | 更新は制限されるべきです。 |
$table->noActionOnUpdate(); | 更新時に action なし |
$table->cascadeOnDelete(); | 削除がカスケード式に行われるべきです。 |
$table->restrictOnDelete(); | 削除は制限されるべきです。 |
$table->nullOnDelete(); | 削除は外部キーの value を null に設定するべきです。 |
追加のcolumn 修飾子は、constrained method の前に呼び出されなければなりません:
$table->foreignId('user_id')
->nullable()
->constrained();
外部の Keys の削除
外部キーを削除するには、dropForeign method を使用し、削除する外部キー制約の名前を引数として渡すことができます。外部キー制約はインデックスと同じ命名規則を使用します。つまり、外部キー制約の名前はテーブルの名前と制約内の列の名前に基づいており、"_foreign"の接尾辞が続きます:
$table->dropForeign('posts_user_id_foreign');
あるいは、外部キーを保持する column 名称を含む array をdropForeign method に渡すこともできます。この array は、Laravel の制約命名の規則を使用して外部キー制約の名前に変換されます:
$table->dropForeign(['user_id']);
外部キー制約の切り替え
次の方法を使用して、 migrations 内で外部キー制約を有効にしたり無効にしたりすることができます:
Schema::enableForeignKeyConstraints();
Schema::disableForeignKeyConstraints();
Schema::withoutForeignKeyConstraints(function () {
// Constraints disabled within this closure...
});
WARNING
SQLite は default で外部 keys 制約を無効にします。 SQLite を使用するときは、migrations を作成しようとする前に、database の設定で外部 keys のサポートを有効にすることを確認してください。 さらに、SQLite はテーブル作成時にのみ外部 keys をサポートし、テーブルが変更されたときはサポートしません 。
Events
便利のため、各マイグレーション操作は dispatch というeventを発行します。以下のすべての events は基本のIlluminate\Database\Events\MigrationEvent class を拡張します:
| Class | 説明 |
|---|---|
Illuminate\Database\Events\MigrationsStarted | batch の migrations が実行されようとしています。 |
Illuminate\Database\Events\MigrationsEnded | batch の migrations が実行を終了しました。 |
Illuminate\Database\Events\MigrationStarted | single のマイグレーションが実行される予定です。 |
Illuminate\Database\Events\MigrationEnded | single マイグレーションの実行が終了しました。 |
Illuminate\Database\Events\SchemaDumped | database schema dump が完了しました。 |
Illuminate\Database\Events\SchemaLoaded | 既存の database schema dump が読み込まれました。 |