Database: Migrations
Table of Contents
Introduction
Migrations は、あなたの database に対するバージョンコントロールのようなもので、チームがアプリケーションの database schema 定義を定義し共有することを可能にします。ソースコントロールから変更を引き込んだ後に、チームメイトに手動で column をローカルの database schema に追加するよう指示したことがあるなら、あなたは database migrations が解決する問題に直面していることでしょう。
Laravel のSchema
facadeは、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
、またはredis
cache 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
batch
option をrollback
command に提供することで、特定の"batch"の migrations をロールバックすることができます。ここで、batch
option は、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
step
option を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:fresh
command は、プレフィックスに関係なくすべての 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 を使用している場合、
geometry
method を使用する前に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 や属性を変更することができます。たとえば、string
column のサイズを増やしたい場合があります。change
method の action を見るために、name
column のサイズを 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 が読み込まれました。 |