FuelPHP での Migration の使い方

昨日の cakephper さんの「FuelPHPでMongoDBを使う」に続きまして、今日は FuelPHP Advent Calendar 2011 10日目です。

ちなみに、ビューは app/classes/views じゃなくて app/views に置くのは、ビューがクラスではないからだと思います。


FuelPHP には、Rails のようなデータベースマイグレーション機能があります。データベースマイグレーションとは、マイグレーションファイルにテーブルの定義を記録して管理する機能です。マイグレーションを使うことでテーブルの変更をフレームワークの枠内で管理することができます。

マイグレーションは oil コマンドを使用します。コマンドの基本的な使い方は以下のようになっています。

oil generate migration <migrationname> [<fieldname1>:<type1> |<fieldname2>:<type2> |..]

それでは、さっそく使ってみましょう。

テーブルの作成

構文
oil generate migration create_{テーブル名} [<fieldname1>:<type1> |<fieldname2>:<type2> |..]

FuelPHP のプロジェクトのトップフォルダに移動して、以下のコマンドを入力します。

$ oil generate migration create_tests name:text email:string[50] password:string[125]

Windows などで、必要最小限の oil コマンドがインストールされていない場合は、

$ php oil generate migration create_tests name:text email:string[50] password:string[125]

と入力してください。結果は同じになります。なお、generate は g と省略することができます。

$ php oil g migration create_tests name:text email:string[50] password:string[125]

これで、

  • fuel/app/migrations/001_create_tests.php

が作成されました。中身を覗いてみましょう。

<?php

namespace Fuel\Migrations;

class Create_users {

	public function up()
	{
		\DBUtil::create_table('tests', array(
			'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),
			'name' => array('type' => 'text'),
			'email' => array('constraint' => 50, 'type' => 'varchar'),
			'password' => array('constraint' => 125, 'type' => 'varchar'),
			'created_at' => array('constraint' => 11, 'type' => 'int'),
			'updated_at' => array('constraint' => 11, 'type' => 'int'),
		), array('id'));
	}

	public function down()
	{
		\DBUtil::drop_table('tests');
	}
}

up() メソッドに新しく適用される変更点、この場合は、tests テーブルを作成するコードが、down() メソッドに適用された変更を取り消すコードが記述されています。

それでは、実際にマイグレーションファイルを実行しテーブルをデータベースに作成しましょう。FuelPHP のデータベース接続の設定はあらかじめしておく必要があります。

$ oil refine migrate
Migrated app:default to latest version: 1.

上記のコマンドは、すべてのマイグレーションファイルを適用しテーブルを最新の状態にします。

phpMyAdmin でデータベースを覗いてみると、テーブルが作成されています。

なお、テーブル名が sw_tests となっているのは、FuelPHP のデータベース接続の設定で prefix を指定しているためです。

コラムの追加

構文
oil generate migration add_{コラム名}_to_{データベース名} <fieldname1>:<type1>

tests テーブルにコラム bio を追加してみましょう。

$ oil g migration add_bio_to_tests bio:text

これで、

  • fuel/app/migrations/002_add_bio_to_tests.php

が作成されました。

$ oil r migrate
Migrated app:default to latest version: 2.

コラム bio が追加されています。


コラム名の変更

構文
oil generate migration rename_field_{フィールド名}_to_{新しいフィールド名}_in_{テーブル名}

bio を biography に変更します。

$ oil g migration rename_field_bio_to_biography_in_tests

このコマンドは FuelPHP 1.1-rc1 の PDO ドライバではまだ実装されていませんでした。

Error - Database method Fuel\Core\Database_PDO_Connection::list_columns is not supported by Fuel\Core\Database_PDO_Connection in COREPATH/classes/database/pdo/connection.php on line 191

MySQL ドライバに変更すると、マイグレーションファイルが作成されました。しかし、FuelPHP 1.1-rc1 ではバグのためマイグレーションを実行するとエラーになりました。

$ oil r migrate

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`biography` text NOT NULL' at line 2 [ ALTER TABLE `sw_tests`
MODIFY `bio` `biography` text NOT NULL ] in COREPATH/classes/database/mysql/connection.php on line 210

コラム名を変更すると、モデルなどのコードもすべて変更する必要が生じますので、実際にはコラム名を変更するということは実務でははとんどないのではないかと思います。ということで、あまり使わないでしょうから、気にせず進みましょう。

テーブル名の変更

構文
oil generate migration rename_table_{テーブル名}_to_{新しいテーブル名}

tests を accounts に変更します。

$ oil g migration rename_table_tests_to_accounts
$ oil r migrate

変更されました。


明日は、@madmamor さんの「FuelPHPでFacebookアプリを作ってみよう。実装編。」です。実装編の準備となる「FuelPHPでFacebookアプリを作ってみよう。準備編。」をまだお読みでない方は、事前にご覧ください。


なお、FuelPHP Advent Calendar 2011 では、まだまだ参加者を募集しています。お気軽にご参加ください!