イントロダクション
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_atとupdate_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']);
});
存在チェック
テーブルの存在確認
hasTable
やhasColumn
を使用し簡単にテーブル、カラムが存在するかチェックできます。
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"テーブルから基本インデックスを削除 |
タイムスタンプとソフトデリートフィールド削除
timestamps
、nullableTimestamps
、softDeletes
のカラムタイプを削除するためには、以下のメソッドが使用できます。
コマンド | 説明 |
---|---|
$table->dropTimestamps(); |
created_atとupdate_atカラムの削除 |
$table->dropSoftDeletes(); |
deleted_atカラムの削除 |
ストレージエンジン
テーブルにストレージエンジンを設定するには、engine
プロパティーをスキーマビルダーにセットしてください。
Schema::create('users', function($table)
{
$table->engine = 'InnoDB';
$table->string('email');
});