イントロダクション

LaravelのSchemaクラスは、データベースエンジンに拠らないテーブル操作方法を提供しています。これはLaravelがサポートしている全てのデータベースで上手く動作し、共通のAPIを持っています。

テーブル作成/削除

テーブルを作成するには、Schema::createメソッドを使用します。

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

createメソッドの最初の引数はテーブル名で、2つ目は無名関数です。新しいテーブルを定義するためのBlueprintオブジェクトを取ります。

存在しているテーブルの名前を変更するにはrenameメソッドを使用してください。

Schema::rename($from, $to);

スキーマ操作のコネクションを指定するには、Schema::connectionメソッドを最初に使用します。

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

テーブルをドロップするためには、Schema::dropメソッドを使用します。

Schema::drop('users');

Schema::dropIfExists('users');

カラム追加

既に存在するテーブルを更新するには、Schema::tableメソッドを使用します。

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

テーブルビルダーは構築に使用する様々なカラムのタイプで構成されています。

コマンド 説明
$table->bigIncrements('id'); BIGINTを使用した自動増分ID
$table->bigInteger('votes'); BIGINTカラム
$table->binary('data'); BLOBカラム
$table->boolean('confirmed'); BOOLEANカラム
$table->char('name', 4); CHARカラム
$table->date('created_at'); DATEカラム
$table->dateTime('created_at'); DATETIMEカラム
$table->decimal('amount', 5, 2); 有効/小数点以下桁数指定のDECIMALカラム
$table->double('column', 15, 8); 15桁、小数点以下8桁のDOUBLEカラム
$table->enum('choices', ['foo', 'bar']); ENUMカラム
$table->float('amount'); FLOATカラム
$table->increments('id'); 自動増分ID(主キー)
$table->integer('votes'); INTEGERカラム
$table->json('options'); JSONフィールド
$table->jsonb('options'); JSONBフィールド
$table->longText('description'); LONGTEXTカラム
$table->mediumInteger('numbers'); MEDIUMINTカラム
$table->mediumText('description'); MEDIUMTEXTカラム
$table->morphs('taggable'); INTERGERのtaggable_idと文字列のtaggable_typeを追加
$table->nullableTimestamps(); NULL値を許す以外、timestamps()と同じ
$table->smallInteger('votes'); SMALLINTカラム
$table->tinyInteger('numbers'); TINYINTカラム
$table->softDeletes(); ソフトデリートのためのdeleted_atカラム追加
$table->string('email'); VARCHARカラム
$table->string('name', 100); 長さ指定のVARCHARカラム
$table->text('description'); TEXTカラム
$table->time('sunrise'); TIMEカラム
$table->timestamp('added_on'); TIMESTAMPカラム
$table->timestamps(); created_atupdate_atカラムの追加
$table->rememberToken(); VARCHAR(100) NULLのremember_tokenを追加
->nullable() カラムにNULL値を許す
->default($value) カラムのデフォルト値設定
->unsigned() INTEGERを符号なしにする

MySQLでafterメソッド使用

MySQLデータベースをお使いでしたら、afterメソッドでカラムの順番を指定することができます。

$table->string('name')->after('email');

カラム変更

注意 カラムを変更する前に、composer.jsonファイルへdoctrine/dbal依存パッケージを追加し、インストールしてください。

まれに既存のカラムを変更する必要がある場合もあります。例えば、文字列のサイズを大きくしたい場合などです。changeメソッドを使えば、簡単にできます! 例えば、nameのサイズを50桁に広げる場合は、次のようにします。

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

また、カラムにNULLを許す(NULLABLE)場合は、以下の通りです。

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

カラム名変更

カラム名を変更するには、renameColumnメソッドをスキーマビルダーで使用してください。カラム名を変更する前に、composer.jsonファイルでdoctrine/dbalを依存パッケージとして追加してください。

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

注意: enumカラムを含んでいるテーブルのカラム名変更は、現在サポートしていません。

カラム削除

カラムをドロップするには、スキーマビルダーのdropColumnメソッドを使用します。カラムをドロップする前に、composer.jsonファイルへdoctrine/dbal依存パッケージを追加してください。

データベーステーブルからカラムをドロップ

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

データベーステーブルから複数のカラムをドロップ

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

存在チェック

テーブルの存在確認

hasTablehasColumnを使用し簡単にテーブル、カラムが存在するかチェックできます。

if (Schema::hasTable('users'))
{
    //
}

カラムの存在確認

if (Schema::hasColumn('users', 'email'))
{
    //
}

インデックス追加

スキーマビルダーは様々なインデックスタイプをサポートしています。追加方法は2つあります。カラムの定義と同時に記述する方法と、後から追加する方法です。

$table->string('email')->unique();

もしくは、別の行でインデックスを追加することを選べます。指定可能なインデックスタイプの一覧です。

コマンド 説明
$table->primary('id'); 主キーを追加
$table->primary(['first', 'last']); 複合キーを追加
$table->unique('email'); ユニークキーを追加
$table->index('state'); 基本的なインデックスを追加

外部キー

Laravelはテーブルに対する、外部キー束縛の追加も提供しています。

$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');

この例では、user_idカラムがusersテーブルのidカラムを参照していることを宣言しています。外部キーカラムを最初に作成するのを忘れないでください。

さらに束縛に対して「デリート時(on delete)」と「更新時(on update)」に対する処理をオプションとして指定できます。

$table->foreign('user_id')
      ->references('id')->on('users')
      ->onDelete('cascade');

外部キーを削除するには、dropForeignメソッドを使用します。他のインデックスで使用されるものと似た命名規則が、外部キーにも使用されています。

$table->dropForeign('posts_user_id_foreign');

注目: 自動増分する整数として参照される外部キーを作成する場合、外部キーの項目作成時はいつでもunsignedを付けるのをお忘れなく。

インデックス削除

インデックスを削除する場合、インデックスの名前を指定します。Laravelはデフォルトで意味が通る名前をインデックスに付けます。シンプルにテーブル名、カラム名、インデックスタイプをつなげたものです。いくつか例をご覧ください。

コマンド 説明
$table->dropPrimary('users_id_primary'); "users"テーブルから主キーを削除
$table->dropUnique('users_email_unique'); "users"テーブルからユニークキーを削除
$table->dropIndex('geo_state_index'); "geo"テーブルから基本インデックスを削除

タイムスタンプとソフトデリートフィールド削除

timestampsnullableTimestampssoftDeletesのカラムタイプを削除するためには、以下のメソッドが使用できます。

コマンド 説明
$table->dropTimestamps(); created_atupdate_atカラムの削除
$table->dropSoftDeletes(); deleted_atカラムの削除

ストレージエンジン

テーブルにストレージエンジンを設定するには、engineプロパティーをスキーマビルダーにセットしてください。

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

    $table->string('email');
});