ふたりはララベル (Laravel PHP Framework)

PHPフレームワークのLaravelの体験記を書いていきます。こんなタイトルのブログですが萌え系アニメは一秒たりとも観たことがありません。

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 ())