migrateでDBテーブルを作成する
LaravelではDBテーブルを作る時に「artisan(アーティザン)」コマンドの「migrate(マイグレート)」オプションを使う方法がある。これを使わなくてもDBのテーブルを構築できるけど、せっかくなので使ってみる。何が便利なのかはいまいちピンと来ない。
まずはオプション無しで「create_users_table」という名前だけを指定してマイグレーションでmakeしてみた。
# php artisan migrate:make create_users_table Created Migration: 2013_07_16_194230_create_users_table Generating optimized class loader Compiling common classes
そうすると「app\database\migrations」に「日付_create_users_table.php」というファイルが生成された。中身はメソッドの枠だけだ。ファイル名に日付があるのはロールバックを想定しているかららしい。
<?php use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // } /** * Reverse the migrations. * * @return void */ public function down() { // } }
これでは便利だとは思えないので、一旦このファイルは削除した。次に「create」オプションをつけて再度実行してみる。
# php artisan migrate:make create_users_table --create=users Created Migration: 2013_07_16_194303_create_users_table Generating optimized class loader Compiling common classes
生成されたファイル「2013_07_16_194303_create_users_table.php」の中身を見ると、スキーマビルダーまで含まれていた。テーブル名、ID、タイムスタンプまで設定されている。これは少し便利かも。
<?php 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->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('users'); } }
IDとタイムスタンプだけでは物足りないので、ソースファイルを直接編集してlengthが100のVARCHAR型とNULL値OKのTEXT型の項目を足してみた。
/** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function(Blueprint $table) { $table->increments('id'); $table->string('name', 100); $table->text('description')->nullable(); $table->timestamps(); }); }
上記のように項目はメソッドを使って足すことができる。スキーマビルダーに設定できるメソッドについてはDB:スキーマビルダーが詳しい。
「2013_07_16_194303_create_users_table.php」を保存して「php artisan migrate」というコマンドを実行すればマイグレーション完了となる。「2013_07_16_194303_create_users_table」のup()が実行されて、DBにテーブルが登録された。
# php artisan migrate Migrated: 2013_07_16_194303_create_users_table
マイグレーションの利点はデータベーススキーマのバージョンコントロールらしいが、composerの設定をしないとロールバックしてもエラーが出る。
# php artisan migrate:reset {"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","me ssage":"Class 'CreateTagTable' not found","file":"C:\\Program Files (x86)\\Apach e Software Foundation\\Apache2.2\\htdocs\\ypn\\vendor\\laravel\\framework\\src\\ Illuminate\\Database\\Migrations\\Migrator.php","line":301}}
またnullable()を明示しないとnullが無効になる。nullが無効だとデータ登録時に初期値を忘れた時にこんなエラーが出る。
[Exception] SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value (SQL: insert into `users` () values ()) (Bindings: array ())