Laravelにはマイグレーションという機能があります。

一言で言うとデータベースバージョン管理システムです。

マイグレーションとは?

普通にデータベースにテーブルを追加するときはどのような操作をしますか?

MySQLやSQLiteなどのSQL文を使ってテーブルを作成するのが代表的です。

他にもPhpMyAdminといったGUIツールも使う人が多いです。

Laravelではテーブルの作成をマイグレーションという機能を使ってPHPコードを用いります。

マイグレーションファイルを見てみる

マイグレーションを記述するPHPファイルはdatabase/migrations/にあります。

見てみると、最初から2つのファイルがあります。

これらは後の章で説明しますが、Laravelにはなんと、最初からユーザーシステムを実装済みなんです。

さて、話を元に戻しますがこれらのファイルの名前に注目してみてください。

2014_10_12_000000_...という形になっています。

これは見ての通りタイムスタンプです。

マイグレーションはこのタイムスタンプでデータベースのバージョン管理をします。

この2つのファイルは2014/10/12日に作成されたことが分かりますね。

そして、タイムスタンプの後ろはcreate_users_tablecreate_password_resets_tableとあります。

create_users_tableは名の通りusersテーブルを作成するマイグレーションファイルです。

同様create_password_resets_tablepassword_resetsテーブルを作成するマイグレーションファイルです。

では試しに、2014_10_12_000000_create_users_table.phpの中を見てみましょう。

2014_10_12_000000_create_users_table.php

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create(‘users’, function (Blueprint $table) {
$table->increments(‘id’);
$table->string(‘name’);
$table->string(‘email’)->unique();
$table->string(‘password’);
$table->rememberToken();
$table->timestamps();
});
} /**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists(‘users’);
}
}

1つのクラスになっていますね。

メッソドにはupdownの2つがあります。

upはマイグレーションが実行されたときに実行される関数です。

upの処理は以下のとおりです。

untitled

Schema::create(‘users’, function (Blueprint $table) {
$table->increments(‘id’);
$table->string(‘name’);
$table->string(‘email’)->unique();
$table->string(‘password’);
$table->rememberToken();
$table->timestamps();
});

まずSchemaというのが気になります。

このSchemaはデータベース操作を使いやすく分かりやすくしてくれたAPIです。

そして、Schema::createはテーブルを作成するメソッドです。

引数は

第一引数にテーブル名

第二引数にテーブル情報を構築する関数

の2つです。

第二引数に渡す関数を見てみます。

untitled

function (Blueprint $table) {
$table->increments(‘id’);
$table->string(‘name’);
$table->string(‘email’)->unique();
$table->string(‘password’);
$table->rememberToken();
$table->timestamps();
}

この関数は引数にBlueprint型の引数を取っています。

Blueprintはテーブルの設計図のようなものです。

そしてこの関数の中身にはどのようなカラムがあるのかなどを設計していきます。

例えば最初は$table->increments('id')とあります。

これはSQLのAutoincrements属性を付与したidという名前のカラムを作っています。

次は$table->string('name')これは文字列型のnameというカラムを作っています。

$table->rememberToken()はユーザーを記憶させるためのトークンです。

最後の$table->timestamps()created_atupdated_atというカラムを作成するものです。

created_atはレコードが作成された日を表し、updated_atはレコードが更新された日を表します。

さて、ここまで一通り説明しましたが、他にも以下のようなものがあります。

コマンド 説明
$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を符号なしにする

downメソッドはマイグレーションのロールバックなどが発生した場合にテーブルやカラムを削除する関数です。

では次にdownメソッドを見てみましょう。

untitled

public function down()
{
Schema::dropIfExists(‘users’);
}

このSchema::dropIfExists関数はテーブルを削除する関数です。

なので、Schema::dropIfExists('users');usersテーブルを削除する処理です。

まとめ

マイグレーションは難しいですが、使いこなすとすごく楽になります。

次回は自分でマイグレーションを作ってみたいと思います。