Laravel5のマイグレーション

便利なんだか不便何だか…なのですが、使い方を熟知しておれば「よくできてるなー」といったこのマイグレーションですが、DBをアプリケーション側からコントロールしておくというアイディアはしごく真っ当。
本家のドキュメントはここにあるので、この記事読まなくてもいいかもです。

マイグレーションファイルの作成

マイグレーションファイル作成コマンド。
$ php artisan make:migration CREATE_TABELS
というようなファイルが作成されます。
2015_10_18_230903_CREATE_TABELS.php
database/migrations/YYYY_MM_DD_hhmmss_CREATE_TABELS.phpという感じの日付付きの中身が空っぽのクラスファイルが出来上がります。
中身はup()とdown()という空のメソッドがあるだけです。このファイルのことをマイグレーションファイルというそうです。慣れない。

テーブルを作成する

実際にテーブルを作成するにはスキーマビルダーなるものを使います。が、その前に前述のマイグレーションファイルなるものは、up()メソッドとdown()メソッドで、通常「作成」と「削除」を行えるようにするものです。なので、テーブルの作成は、up()メソッドの中に書いてゆきます。
というわけで、up()の中にテーブルを作成してみます。
以下のコマンドを実行すると、先ほどのCREATE_TABELSにusersテーブルの雛形が作成されます。
$ php artisan make:migration CREATE_TABELS --create=xxxxx
YYYY_MM_DD_hhmmss_CREATE_TABELS.phpでもって新しく付番されたマイグレーションファイルが作成されます。
--create=usersを指定するとusersテーブルを作成する準備をするスキーマビルダーを作成します。
マイグレーションファイルの中身を見ると、
Schema::create('xxxxx', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});

というオートインクリメントとタイムスタンプの入ったテーブルの雛形が作られております。
ただ、これはスキーマビルダーということなので実際にはテーブルの作成はまだしません。
テーブルを実際に作成するには、
$ php artisan migrate
というコマンドをガツン!と実行します。これでテーブルが作成されてしまいます。便利です。

テーブルのスキーマを作成する

ただオートインクリメントとタイムスタンプだけのテーブルじゃ何もできないので、いろいろ細かくスキーマを設定します。テーブルのスキーマ設定はとても面倒くさいのですが、Laravel5でもやっぱり面倒くさいです。
例えば、名前とEmail、年齢といったカラムを作成する場合は以下のようになるかもしれません。
Schema::create('xxxxx', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->integer('age');
$table->timestamps();
});

結局はSymfonyでもLaravelでもここは手作業で地味にやらないとダメなわけです。
これを地味に書いて最後に"php artisan migrate"を実行してテーブル作成します。

テーブルのスキーマを更新する

たいていスキーマを作成すると間違います。あるいは後ほど更新します。なので更新できないと非常に困ります。しかしこれまた面倒くさいのがdoctrine/dbalが必要だということです。もう最初から入れてください。
composerでdoctrine/dbalを入れておきます。これがないとスキーマの更新ができないのです。(もう本当にSQL文自分で実行しちゃうぞ。)
composer.jsonに以下を加えて、
{
"require": {
"doctrine/dbal": "~2.5.1"
}
}

インストール
$ php composer.phar install
(なんかlockファイルがどうしたこうした言われたので強制的にえい!)しかしアプリケーションサイドにPHPのモジュール関連のインストール権限が渡ってきた今ですが、composer遅いです。マジで。
しかしこれでスキーマビルダーでもってテーブルの内容を更新したり削除したりできます。今日はつかれたのでまた今度。

主なスキーマビルダー

主なスキーマビルダーはこんな感じです。
$table->bigIncrements('id'); Incrementing ID (primary key) using a "UNSIGNED BIG INTEGER" equivalent.
$table->bigInteger('votes'); BIGINT equivalent for the database.
$table->binary('data'); BLOB equivalent for the database.
$table->boolean('confirmed'); BOOLEAN equivalent for the database.
$table->char('name', 4); CHAR equivalent with a length.
$table->date('created_at'); DATE equivalent for the database.
$table->dateTime('created_at'); DATETIME equivalent for the database.
$table->decimal('amount', 5, 2); DECIMAL equivalent with a precision and scale.
$table->double('column', 15, 8); DOUBLE equivalent with precision, 15 digits in total and 8 after the decimal point.
$table->enum('choices', ['foo', 'bar']); ENUM equivalent for the database.
$table->float('amount'); FLOAT equivalent for the database.
$table->increments('id'); Incrementing ID (primary key) using a "UNSIGNED INTEGER" equivalent.
$table->integer('votes'); INTEGER equivalent for the database.
$table->json('options'); JSON equivalent for the database.
$table->jsonb('options'); JSONB equivalent for the database.
$table->longText('description'); LONGTEXT equivalent for the database.
$table->mediumInteger('numbers'); MEDIUMINT equivalent for the database.
$table->mediumText('description'); MEDIUMTEXT equivalent for the database.
$table->morphs('taggable'); Adds INTEGER taggable_id and STRING taggable_type.
$table->nullableTimestamps(); Same as timestamps(), except allows NULLs.
$table->rememberToken(); Adds remember_token as VARCHAR(100) NULL.
$table->smallInteger('votes'); SMALLINT equivalent for the database.
$table->softDeletes(); Adds deleted_at column for soft deletes.
$table->string('email'); VARCHAR equivalent column.
$table->string('name', 100); VARCHAR equivalent with a length.
$table->text('description'); TEXT equivalent for the database.
$table->time('sunrise'); TIME equivalent for the database.
$table->tinyInteger('numbers'); TINYINT equivalent for the database.
$table->timestamp('added_on'); TIMESTAMP equivalent for the database.
$table->timestamps(); Adds created_at and updated_at columns.