- はじめに
- マイグレーションの生成
- マイグレーション構造
- マイグレーションの実行
- マイグレーションのロールバック
- テーブルの更新
- テーブルの名前変更/削除
- カラム
- カラムの作成
- 利用可能なカラムタイプ
- 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()
- nullableTimestamps()
- nullableMorphs()
- 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()
- Column Modifiers
- Modifying Columns
- Renaming Columns
- Dropping Columns
- Indexes
- Events
はじめに
マイグレーションは、データベースのバージョン管理のようなもので、チームがアプリケーションのデータベーススキーマ定義を定義し、共有できるようにします。ソース管理から変更をプルした後に、チームメイトにローカルデータベーススキーマに手動でカラムを追加するように指示したことがあるなら、あなたはデータベースマイグレーションが解決する問題に直面したことがあります。
Laravel Schema
ファサードは、Laravelがサポートするすべてのデータベースシステムでテーブルを作成および操作するためのデータベース非依存のサポートを提供します。通常、マイグレーションはこのファサードを使用してデータベースのテーブルやカラムを作成および変更します。
マイグレーションの生成
make:migration
Artisanコマンドを使用してデータベースマイグレーションを生成できます。新しいマイグレーションは、database/migrations
ディレクトリに配置されます。各マイグレーションのファイル名には、Laravelがマイグレーションの順序を決定するためのタイムスタンプが含まれています:
php artisan make:migration create_flights_table
Laravelは、マイグレーションの名前を使用して、テーブルの名前を推測し、マイグレーションが新しいテーブルを作成するかどうかを判断しようとします。Laravelがマイグレーション名からテーブル名を特定できる場合、Laravelは生成されたマイグレーションファイルを指定されたテーブルで事前に埋めます。そうでない場合は、マイグレーションファイル内で手動でテーブルを指定できます。
生成されたマイグレーションのカスタムパスを指定したい場合は、--path
オプションを使用してmake:migration
コマンドを実行できます。指定されたパスは、アプリケーションのベースパスに対して相対的である必要があります。
マイグレーションスタブは、スタブの公開を使用してカスタマイズできます。
マイグレーションの圧縮
アプリケーションを構築するにつれて、時間とともにますます多くのマイグレーションが蓄積されることがあります。これにより、database/migrations
ディレクトリが数百のマイグレーションで膨れ上がる可能性があります。希望する場合は、マイグレーションを単一のSQLファイルに「圧縮」できます。始めるには、schema:dump
コマンドを実行します:
php artisan schema:dump
# 現在のデータベーススキーマをダンプし、すべての既存のマイグレーションを削除...
php artisan schema:dump --prune
このコマンドを実行すると、Laravelはアプリケーションのdatabase/schema
ディレクトリに「スキーマ」ファイルを書き込みます。スキーマファイルの名前は、データベース接続に対応します。現在、データベースをマイグレーションしようとし、他のマイグレーションが実行されていない場合、Laravelは最初に使用しているデータベース接続のスキーマファイル内のSQL文を実行します。スキーマファイルのSQL文を実行した後、Laravelはスキーマダンプの一部でない残りのマイグレーションを実行します。
アプリケーションのテストが通常のローカル開発中に使用するデータベース接続とは異なる場合、そのデータベース接続を使用してスキーマファイルをダンプしていることを確認する必要があります。通常のローカル開発中に使用するデータベース接続をダンプした後にこれを行うことをお勧めします:
php artisan schema:dump
php artisan schema:dump --database=testing --prune
データベーススキーマファイルをソース管理にコミットして、チームの他の新しい開発者がアプリケーションの初期データベース構造を迅速に作成できるようにする必要があります。
マイグレーションの圧縮は、MariaDB、MySQL、PostgreSQL、および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;
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
プロパティを設定する必要があります:
/**
* The database connection that should be used by the migration.
*
* @var string
*/
protected $connection = 'pgsql';
/**
* Run the migrations.
*/
public function up(): void
{
// ...
}
マイグレーションの実行
未処理のすべてのマイグレーションを実行するには、migrate
Artisanコマンドを実行します:
php artisan migrate
これまでに実行されたマイグレーションを確認したい場合は、migrate:status
Artisanコマンドを使用できます:
php artisan migrate:status
マイグレーションによって実行されるSQL文を実際に実行せずに確認したい場合は、--pretend
フラグをmigrate
コマンドに提供できます:
php artisan migrate --pretend
マイグレーション実行の隔離
アプリケーションを複数のサーバーにデプロイし、デプロイプロセスの一部としてマイグレーションを実行している場合、2つのサーバーが同時にデータベースをマイグレーションしようとすることは望ましくありません。これを避けるために、isolated
オプションをmigrate
コマンドを呼び出すときに使用できます。
``````shell
php artisan migrate --isolated
`
この機能を利用するには、アプリケーションがmemcached
、redis
、dynamodb
、database
、file
、またはarray
キャッシュドライバーをデフォルトのキャッシュドライバーとして使用している必要があります。さらに、すべてのサーバーは同じ中央キャッシュサーバーと通信している必要があります。
本番環境でのマイグレーションの強制実行
一部のマイグレーション操作は破壊的であり、データを失う可能性があります。これらのコマンドを本番データベースに対して実行することから保護するために、コマンドが実行される前に確認を求められます。プロンプトなしでコマンドを強制的に実行するには、--force
フラグを使用します:
php artisan migrate --force
マイグレーションのロールバック
最新のマイグレーション操作をロールバックするには、rollback
Artisanコマンドを使用できます。このコマンドは、最後の「バッチ」のマイグレーションをロールバックします。これには複数のマイグレーションファイルが含まれる場合があります:
php artisan migrate:rollback
``````shell
php artisan migrate:rollback --step=5
`
特定の「バッチ」のマイグレーションをロールバックするには、batch
オプションをrollback
コマンドに提供します。ここで、batch
オプションはアプリケーションのmigrations
データベーステーブル内のバッチ値に対応します。たとえば、次のコマンドはバッチ3のすべてのマイグレーションをロールバックします:
php artisan migrate:rollback --batch=3
マイグレーションによって実行されるSQL文を実際に実行せずに確認したい場合は、--pretend
フラグをmigrate:rollback
コマンドに提供できます:
php artisan migrate:rollback --pretend
``````shell
php artisan migrate:reset
`
単一コマンドを使用してロールバックとマイグレーション
``````shell
php artisan migrate:refresh
# データベースをリフレッシュし、すべてのデータベースシードを実行...
php artisan migrate:refresh --seed
`
限られた数のマイグレーションをロールバックして再マイグレーションするには、step
オプションをrefresh
コマンドに提供します。たとえば、次のコマンドは最後の5つのマイグレーションをロールバックして再マイグレーションします:
php artisan migrate:refresh --step=5
すべてのテーブルを削除してマイグレーション
``````shell
php artisan migrate:fresh
php artisan migrate:fresh --seed
`
デフォルトでは、migrate:fresh
コマンドはデフォルトのデータベース接続からのみテーブルを削除します。ただし、--database
オプションを使用して、マイグレーションすべきデータベース接続を指定できます。データベース接続名は、アプリケーションのdatabase
設定ファイルで定義された接続に対応する必要があります:
php artisan migrate:fresh --database=admin
<a name="tables"></a>
## テーブル
<a name="creating-tables"></a>
### テーブルの作成
新しいデータベーステーブルを作成するには、`````create`````メソッドを`````Schema`````ファサードで使用します。`````create`````メソッドは2つの引数を受け取ります:最初はテーブルの名前で、2番目は新しいテーブルを定義するために使用できる`````Blueprint`````オブジェクトを受け取るクロージャです:
``````php
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
、およびhasIndex
メソッドを使用します:
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...
}
データベース接続とテーブルオプション
アプリケーションのデフォルト接続ではないデータベース接続でスキーマ操作を実行したい場合は、connection
メソッドを使用します:
Schema::connection('sqlite')->create('users', function (Blueprint $table) {
$table->id();
});
さらに、テーブルの作成の他の側面を定義するために使用できるいくつかの他のプロパティとメソッドがあります。engine
プロパティは、MariaDBまたはMySQLを使用する際にテーブルのストレージエンジンを指定するために使用できます:
Schema::create('users', function (Blueprint $table) {
$table->engine('InnoDB');
// ...
});
``````php
Schema::create('users', function (Blueprint $table) {
$table->charset('utf8mb4');
$table->collation('utf8mb4_unicode_ci');
// ...
});
`
``````php
Schema::create('calculations', function (Blueprint $table) {
$table->temporary();
// ...
});
`
データベーステーブルに「コメント」を追加したい場合は、テーブルインスタンスでcomment
メソッドを呼び出すことができます。テーブルコメントは、現在MariaDB、MySQL、およびPostgreSQLでのみサポートされています:
Schema::create('calculations', function (Blueprint $table) {
$table->comment('Business calculations');
// ...
});
テーブルの更新
``````php
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');
外部キーを持つテーブルの名前変更
テーブルの名前を変更する前に、テーブル上の外部キー制約がマイグレーションファイル内で明示的な名前を持っていることを確認する必要があります。そうでない場合、外部キー制約名は古いテーブル名を参照します。
カラム
カラムの作成
``````php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});
`
利用可能なカラムタイプ
スキーマビルダーブループリントは、データベーステーブルに追加できるさまざまなタイプのカラムに対応するさまざまなメソッドを提供します。利用可能な各メソッドは、以下の表にリストされています:
bigIncrements bigInteger binary boolean char dateTimeTz dateTime date decimal double enum float foreignId foreignIdFor foreignUlid foreignUuid geography geometry id increments integer ipAddress json jsonb longText macAddress mediumIncrements mediumInteger mediumText morphs nullableMorphs nullableTimestamps nullableUlidMorphs nullableUuidMorphs rememberToken set smallIncrements smallInteger softDeletesTz softDeletes string text timeTz time timestampTz timestamp timestampsTz timestamps tinyIncrements tinyInteger tinyText unsignedBigInteger unsignedInteger unsignedMediumInteger unsignedSmallInteger unsignedTinyInteger ulidMorphs uuidMorphs ulid uuid year
bigIncrements()
bigIncrements
メソッドは、自動インクリメントするUNSIGNED BIGINT
(主キー)に相当するカラムを作成します:
$table->bigIncrements('id');
bigInteger()
``````php
$table->bigInteger('votes');
`
binary()
``````php
$table->binary('photo');
`
MySQL、MariaDB、またはSQL Serverを使用する場合、length
およびfixed
引数を渡して、VARBINARY
またはBINARY
に相当するカラムを作成できます:
$table->binary('data', length: 16); // VARBINARY(16)
$table->binary('data', length: 16, fixed: true); // BINARY(16)
boolean()
``````php
$table->boolean('confirmed');
`
char()
``````php
$table->char('name', length: 100);
`
dateTimeTz()
``````php
$table->dateTimeTz('created_at', precision: 0);
`
dateTime()
``````php
$table->dateTime('created_at', precision: 0);
`
date()
``````php
$table->date('created_at');
`
decimal()
``````php
$table->decimal('amount', total: 8, places: 2);
`
double()
``````php
$table->double('amount');
`
enum()
``````php
$table->enum('difficulty', ['easy', 'hard']);
`
float()
``````php
$table->float('amount', precision: 53);
`
foreignId()
foreignId
メソッドは、UNSIGNED BIGINT
に相当するカラムを作成します:
$table->foreignId('user_id');
foreignIdFor()
foreignIdFor
メソッドは、指定されたモデルクラスのために{column}_id
に相当するカラムを追加します。カラムタイプは、モデルキータイプに応じてUNSIGNED BIGINT
、CHAR(36)
、またはCHAR(26)
になります:
$table->foreignIdFor(User::class);
foreignUlid()
``````php
$table->foreignUlid('user_id');
`
foreignUuid()
``````php
$table->foreignUuid('user_id');
`
geography()
``````php
$table->geography('coordinates', subtype: 'point', srid: 4326);
`
空間タイプのサポートは、データベースドライバーに依存します。データベースのドキュメントを参照してください。アプリケーションがPostgreSQLデータベースを利用している場合、geography
メソッドを使用する前にPostGIS拡張機能をインストールする必要があります。
geometry()
``````php
$table->geometry('positions', subtype: 'point', srid: 0);
`
空間タイプのサポートは、データベースドライバーに依存します。データベースのドキュメントを参照してください。アプリケーションがPostgreSQLデータベースを利用している場合、geometry
メソッドを使用する前にPostGIS拡張機能をインストールする必要があります。
id()
``````php
$table->id();
`
increments()
increments
メソッドは、自動インクリメントするUNSIGNED INTEGER
に相当するカラムを主キーとして作成します:
$table->increments('id');
integer()
``````php
$table->integer('votes');
`
ipAddress()
``````php
$table->ipAddress('visitor');
`
PostgreSQLを使用する場合、INET
カラムが作成されます。
json()
``````php
$table->json('options');
`
jsonb()
``````php
$table->jsonb('options');
`
longText()
``````php
$table->longText('description');
`
MySQLまたはMariaDBを利用する場合、カラムにbinary
文字セットを適用して、LONGBLOB
に相当するカラムを作成できます:
$table->longText('data')->charset('binary'); // LONGBLOB
macAddress()
``````php
$table->macAddress('device');
`
mediumIncrements()
mediumIncrements
メソッドは、自動インクリメントするUNSIGNED MEDIUMINT
に相当するカラムを主キーとして作成します:
$table->mediumIncrements('id');
mediumInteger()
``````php
$table->mediumInteger('votes');
`
mediumText()
``````php
$table->mediumText('description');
`
MySQLまたはMariaDBを利用する場合、カラムにbinary
文字セットを適用して、MEDIUMBLOB
に相当するカラムを作成できます:
$table->mediumText('data')->charset('binary'); // MEDIUMBLOB
morphs()
morphs
メソッドは、{column}_id
に相当するカラムと{column}_type
VARCHAR
に相当するカラムを追加する便利なメソッドです。{column}_id
のカラムタイプは、モデルキータイプに応じてUNSIGNED BIGINT
、CHAR(36)
、またはCHAR(26)
になります。
このメソッドは、ポリモーフィックなエロクアントリレーションシップに必要なカラムを定義する際に使用されることを意図しています。次の例では、taggable_id
およびtaggable_type
カラムが作成されます:
$table->morphs('taggable');
nullableTimestamps()
``````php
$table->nullableTimestamps(precision: 0);
`
nullableMorphs()
このメソッドは、morphsメソッドに似ていますが、作成されるカラムは「nullable」になります:
$table->nullableMorphs('taggable');
nullableUlidMorphs()
このメソッドは、ulidMorphsメソッドに似ていますが、作成されるカラムは「nullable」になります:
$table->nullableUlidMorphs('taggable');
nullableUuidMorphs()
このメソッドは、uuidMorphsメソッドに似ていますが、作成されるカラムは「nullable」になります:
$table->nullableUuidMorphs('taggable');
rememberToken()
``````php
$table->rememberToken();
`
set()
``````php
$table->set('flavors', ['strawberry', 'vanilla']);
`
smallIncrements()
smallIncrements
メソッドは、自動インクリメントするUNSIGNED SMALLINT
に相当するカラムを主キーとして作成します:
$table->smallIncrements('id');
smallInteger()
``````php
$table->smallInteger('votes');
`
softDeletesTz()
softDeletesTz
メソッドは、nullableなdeleted_at
TIMESTAMP
(タイムゾーン付き)に相当するカラムを作成し、オプションの小数秒精度を持ちます。このカラムは、Eloquentの「ソフト削除」機能に必要なdeleted_at
タイムスタンプを保存することを目的としています:
$table->softDeletesTz('deleted_at', precision: 0);
softDeletes()
softDeletes
メソッドは、nullableなdeleted_at
TIMESTAMP
に相当するカラムを作成し、オプションの小数秒精度を持ちます。このカラムは、Eloquentの「ソフト削除」機能に必要なdeleted_at
タイムスタンプを保存することを目的としています:
$table->softDeletes('deleted_at', precision: 0);
string()
``````php
$table->string('name', length: 100);
`
text()
``````php
$table->text('description');
`
MySQLまたはMariaDBを利用する場合、カラムにbinary
文字セットを適用して、BLOB
に相当するカラムを作成できます:
$table->text('data')->charset('binary'); // BLOB
timeTz()
``````php
$table->timeTz('sunrise', precision: 0);
`
time()
``````php
$table->time('sunrise', precision: 0);
`
timestampTz()
``````php
$table->timestampTz('added_at', precision: 0);
`
timestamp()
``````php
$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()
``````php
$table->tinyInteger('votes');
`
tinyText()
tinyText
メソッドは、TINYTEXT
相当のカラムを作成します:
$table->tinyText('notes');
MySQL または MariaDB を使用する場合、binary
文字セットをカラムに適用して、TINYBLOB
相当のカラムを作成できます:
$table->tinyText('data')->charset('binary'); // TINYBLOB
unsignedBigInteger()
unsignedBigInteger
メソッドは、UNSIGNED BIGINT
相当のカラムを作成します:
$table->unsignedBigInteger('votes');
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');
ulidMorphs()
ulidMorphs
メソッドは、{column}_id
CHAR(26)
相当のカラムと、{column}_type
VARCHAR
相当のカラムを追加する便利なメソッドです。
このメソッドは、ULID 識別子を使用する多態的 Eloquent リレーションシップ に必要なカラムを定義する際に使用されることを意図しています。次の例では、taggable_id
と taggable_type
カラムが作成されます:
$table->ulidMorphs('taggable');
uuidMorphs()
uuidMorphs
メソッドは、{column}_id
CHAR(36)
相当のカラムと、{column}_type
VARCHAR
相当のカラムを追加する便利なメソッドです。
このメソッドは、UUID 識別子を使用する多態的 Eloquent リレーションシップ に必要なカラムを定義する際に使用されることを意図しています。次の例では、taggable_id
と taggable_type
カラムが作成されます:
$table->uuidMorphs('taggable');
ulid()
ulid
メソッドは、ULID
相当のカラムを作成します:
$table->ulid('id');
uuid()
uuid
メソッドは、UUID
相当のカラムを作成します:
$table->uuid('id');
year()
year
メソッドは、YEAR
相当のカラムを作成します:
$table->year('birth_year');
Column Modifiers
上記のカラムタイプに加えて、データベーステーブルにカラムを追加する際に使用できるいくつかのカラム「修飾子」があります。たとえば、カラムを「nullable」にするには、nullable
メソッドを使用します:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});
次の表には、利用可能なすべてのカラム修飾子が含まれています。このリストには インデックス修飾子 は含まれていません:
修飾子 | 説明 |
---|---|
->after('column') |
カラムを別のカラムの「後」に配置します (MariaDB / MySQL)。 |
->autoIncrement() |
INTEGER カラムを自動インクリメント (主キー) として設定します。 |
->charset('utf8mb4') |
カラムの文字セットを指定します (MariaDB / MySQL)。 |
->collation('utf8mb4_unicode_ci') |
カラムの照合順序を指定します。 |
->comment('my comment') |
カラムにコメントを追加します (MariaDB / MySQL / PostgreSQL)。 |
->default($value) |
カラムの「デフォルト」値を指定します。 |
->first() |
カラムをテーブルの「最初」に配置します (MariaDB / MySQL)。 |
->from($integer) |
自動インクリメントフィールドの開始値を設定します (MariaDB / MySQL / PostgreSQL)。 |
->invisible() |
SELECT * クエリに対してカラムを「非表示」にします (MariaDB / MySQL)。 |
->nullable($value = true) |
NULL 値をカラムに挿入できるようにします。 |
->storedAs($expression) |
ストアド生成カラムを作成します (MariaDB / MySQL / PostgreSQL / SQLite)。 |
->unsigned() |
INTEGER カラムを UNSIGNED として設定します (MariaDB / MySQL)。 |
->useCurrent() |
TIMESTAMP カラムをデフォルト値として CURRENT_TIMESTAMP を使用します。 |
->useCurrentOnUpdate() |
TIMESTAMP カラムをレコードが更新されるときに CURRENT_TIMESTAMP を使用します (MariaDB / MySQL)。 |
->virtualAs($expression) |
仮想生成カラムを作成します (MariaDB / MySQL / SQLite)。 |
->generatedAs($expression) |
指定されたシーケンスオプションを持つアイデンティティカラムを作成します (PostgreSQL)。 |
->always() |
アイデンティティカラムの入力に対するシーケンス値の優先順位を定義します (PostgreSQL)。 |
Default Expressions
default
修飾子は、値または Illuminate\Database\Query\Expression
インスタンスを受け入れます。Expression
インスタンスを使用すると、Laravel が値を引用符で囲むのを防ぎ、データベース固有の関数を使用できるようになります。この機能が特に便利な状況は、JSON カラムにデフォルト値を割り当てる必要があるときです:
<?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();
});
}
};
デフォルト式のサポートは、データベースドライバ、データベースバージョン、およびフィールドタイプに依存します。データベースのドキュメントを参照してください。
Column Order
MariaDB または MySQL データベースを使用する場合、after
メソッドを使用して、スキーマ内の既存のカラムの後にカラムを追加できます:
$table->after('password', function (Blueprint $table) {
$table->string('address_line1');
$table->string('address_line2');
$table->string('city');
});
Modifying Columns
change
メソッドを使用すると、既存のカラムのタイプと属性を変更できます。たとえば、string
カラムのサイズを増やしたい場合があります。change
メソッドの動作を確認するために、name
カラムのサイズを 25 から 50 に増やしてみましょう。これを実現するには、カラムの新しい状態を定義し、change
メソッドを呼び出すだけです:
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});
カラムを変更する際は、カラム定義に保持したいすべての修飾子を明示的に含める必要があります。欠落している属性は削除されます。たとえば、unsigned
、default
、comment
属性を保持するには、カラムを変更する際に各修飾子を明示的に呼び出す必要があります:
Schema::table('users', function (Blueprint $table) {
$table->integer('votes')->unsigned()->default(1)->comment('my comment')->change();
});
``````php
// Add an index...
$table->bigIncrements('id')->primary()->change();
// Drop an index...
$table->char('postal_code', 10)->unique(false)->change();
`
Renaming Columns
カラムの名前を変更するには、スキーマビルダーによって提供される renameColumn
メソッドを使用できます:
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
Dropping Columns
カラムを削除するには、スキーマビルダーの dropColumn
メソッドを使用できます:
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});
カラム名の配列を dropColumn
メソッドに渡すことで、テーブルから複数のカラムを削除できます:
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});
Available Command Aliases
Laravel は、一般的なタイプのカラムを削除するための便利なメソッドをいくつか提供しています。これらのメソッドは、以下の表に説明されています:
コマンド | 説明 |
---|---|
$table->dropMorphs('morphable'); |
morphable_id および morphable_type カラムを削除します。 |
$table->dropRememberToken(); |
remember_token カラムを削除します。 |
$table->dropSoftDeletes(); |
deleted_at カラムを削除します。 |
$table->dropSoftDeletesTz(); |
dropSoftDeletes() メソッドのエイリアスです。 |
$table->dropTimestamps(); |
created_at および updated_at カラムを削除します。 |
$table->dropTimestampsTz(); |
dropTimestamps() メソッドのエイリアスです。 |
Indexes
Creating Indexes
Laravel スキーマビルダーは、いくつかのタイプのインデックスをサポートしています。次の例では、新しい email
カラムを作成し、その値が一意であることを指定します。インデックスを作成するには、カラム定義に unique
メソッドをチェーンします:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->string('email')->unique();
});
また、カラムを定義した後にインデックスを作成することもできます。その場合、スキーマビルダーのブループリントで unique
メソッドを呼び出す必要があります。このメソッドは、一意のインデックスを受け取るカラムの名前を受け入れます:
$table->unique('email');
カラムの配列をインデックスメソッドに渡して、複合 (または合成) インデックスを作成することもできます:
$table->index(['account_id', 'created_at']);
インデックスを作成する際、Laravel はテーブル、カラム名、およびインデックスタイプに基づいてインデックス名を自動的に生成しますが、メソッドに第二引数を渡してインデックス名を自分で指定することもできます:
$table->unique('email', 'unique_email');
Available Index Types
Laravel のスキーマビルダーのブループリントクラスは、Laravel がサポートする各タイプのインデックスを作成するためのメソッドを提供します。各インデックスメソッドは、インデックスの名前を指定するためのオプションの第二引数を受け入れます。省略した場合、名前はインデックスに使用されるテーブルおよびカラムの名前、ならびにインデックスタイプから導出されます。利用可能なインデックスメソッドは、以下の表に説明されています:
コマンド | 説明 |
---|---|
$table->primary('id'); |
主キーを追加します。 |
$table->primary(['id', 'parent_id']); |
複合キーを追加します。 |
$table->unique('email'); |
一意のインデックスを追加します。 |
$table->index('state'); |
インデックスを追加します。 |
$table->fullText('body'); |
フルテキストインデックスを追加します (MariaDB / MySQL / PostgreSQL)。 |
$table->fullText('body')->language('english'); |
指定された言語のフルテキストインデックスを追加します (PostgreSQL)。 |
$table->spatialIndex('location'); |
空間インデックスを追加します (SQLite を除く)。 |
Renaming Indexes
インデックスの名前を変更するには、スキーマビルダーのブループリントによって提供される renameIndex
メソッドを使用できます。このメソッドは、現在のインデックス名を第一引数として、希望する名前を第二引数として受け取ります:
$table->renameIndex('from', 'to')
Dropping Indexes
インデックスを削除するには、インデックスの名前を指定する必要があります。デフォルトでは、Laravel はテーブル名、インデックスされたカラムの名前、およびインデックスタイプに基づいてインデックス名を自動的に割り当てます。以下はその例です:
コマンド | 説明 |
---|---|
$table->dropPrimary('users_id_primary'); |
“users” テーブルから主キーを削除します。 |
$table->dropUnique('users_email_unique'); |
“users” テーブルから一意のインデックスを削除します。 |
$table->dropIndex('geo_state_index'); |
“geo” テーブルから基本インデックスを削除します。 |
$table->dropFullText('posts_body_fulltext'); |
“posts” テーブルからフルテキストインデックスを削除します。 |
$table->dropSpatialIndex('geo_location_spatialindex'); |
“geo” テーブルから空間インデックスを削除します (SQLite を除く)。 |
インデックスを削除するメソッドにカラムの配列を渡すと、従来のインデックス名がテーブル名、カラム、およびインデックスタイプに基づいて生成されます:
Schema::table('geo', function (Blueprint $table) {
$table->dropIndex(['state']); // Drops index 'geo_state_index'
});
Foreign Key Constraints
Laravel は、データベースレベルでの参照整合性を強制するために使用される外部キー制約の作成をサポートしています。たとえば、user_id
カラムを posts
テーブルに定義し、users
テーブルの 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(
table: 'users', indexName: 'posts_user_id'
);
});
制約の「on delete」および「on update」プロパティに対する希望するアクションを指定することもできます:
$table->foreignId('user_id')
->constrained()
->onUpdate('cascade')
->onDelete('cascade');
これらのアクションに対しても、代替の表現的な構文が提供されています:
メソッド | 説明 |
---|---|
$table->cascadeOnUpdate(); |
更新はカスケードします。 |
$table->restrictOnUpdate(); |
更新は制限されます。 |
$table->noActionOnUpdate(); |
更新時にアクションはありません。 |
$table->cascadeOnDelete(); |
削除はカスケードします。 |
$table->restrictOnDelete(); |
削除は制限されます。 |
$table->nullOnDelete(); |
削除時に外部キー値を null に設定します。 |
$table->noActionOnDelete(); |
子レコードが存在する場合は削除を防ぎます。 |
追加の カラム修飾子 は、constrained
メソッドの前に呼び出す必要があります:
$table->foreignId('user_id')
->nullable()
->constrained();
Dropping Foreign Keys
外部キーを削除するには、dropForeign
メソッドを使用し、削除する外部キー制約の名前を引数として渡します。外部キー制約はインデックスと同じ命名規則を使用します。言い換えれば、外部キー制約名は、テーブル名と制約内のカラム名に基づき、”_foreign” サフィックスが付加されます:
$table->dropForeign('posts_user_id_foreign');
また、外部キーを保持するカラム名を含む配列を dropForeign
メソッドに渡すこともできます。配列は、Laravel の制約命名規則を使用して外部キー制約名に変換されます:
$table->dropForeign(['user_id']);
Toggling Foreign Key Constraints
マイグレーション内で外部キー制約を有効または無効にするには、次のメソッドを使用します:
Schema::enableForeignKeyConstraints();
Schema::disableForeignKeyConstraints();
Schema::withoutForeignKeyConstraints(function () {
// Constraints disabled within this closure...
});
SQLite はデフォルトで外部キー制約を無効にします。SQLite を使用する場合は、マイグレーション内で作成する前に、データベース設定で 外部キーサポートを有効にする ことを確認してください。
Events
便利なことに、各マイグレーション操作は イベント を発行します。以下のすべてのイベントは、基本 Illuminate\Database\Events\MigrationEvent
クラスを拡張します:
クラス | 説明 |
---|---|
Illuminate\Database\Events\MigrationsStarted |
マイグレーションのバッチが実行されようとしています。 |
Illuminate\Database\Events\MigrationsEnded |
マイグレーションのバッチが実行を完了しました。 |
Illuminate\Database\Events\MigrationStarted |
単一のマイグレーションが実行されようとしています。 |
Illuminate\Database\Events\MigrationEnded |
単一のマイグレーションが実行を完了しました。 |
Illuminate\Database\Events\NoPendingMigrations |
マイグレーションコマンドに保留中のマイグレーションがありません。 |
Illuminate\Database\Events\SchemaDumped |
データベーススキーマのダンプが完了しました。 |
Illuminate\Database\Events\SchemaLoaded |
既存のデータベーススキーマのダンプが読み込まれました。 |