tetu式

ゲームと音楽・作曲の自己満足と悩みどころの多いプログラムのブログ。

fuelPHP マイグレーションについて

久々のfuelPHP記事になります。

調べればどういうものなのか出てくるかと思いますがマイグレーションについて。
先輩に言われても全然理解しきれないのでここらで理解力を深めるために自分でいろいろと調査。


そもそもマイグレーションってなんぞ?というところから。
マイグレーション:migrationとは移転、移住、乗換とかを意味する英単語です。
ITでは使用しているデータを別環境に移したり、新しい環境に切り替えると言った感じの意味。

fuelPHPにおけるマイグレーションはデータベース周りの機能になります。
ドキュメントはこちら



使用用途としては直接DBにSQL文を打ち込まなくてもテーブル作成やカラムの追加、編集ができたりします。
こういう機能的なものをデータベースに触れた当時から使ってるのでSQLのCREATE文の書き方をかなり忘れがちになってきてますが・・・まぁおいといて。

とりあえずやってみましょう。まずはテーブルの新規作成から。


webサーバ上でコマンドを叩いて、まずはプロジェクトトップに移動します。
何なのか覚えてない場合はとりあえずoilファイルがあるところまで頑張って移動してください。
移動したらこんなコマンドを実行。

php oil generate model create_テーブル名 カラム名1:カラム1の変数の型[文字列の長さ] カラム名2:カラム2の変数の型[文字列の長さ]

カラム名はとりあえず自分で考えて入れてみてください。
変数の型は使用するDBで使える型を入力。intとかvarcharとかその辺です。
文字列の長さについては省略可能ですが、文字列を扱う変数の場合は入れるように。
また、generateのところは g とだけ書いても大丈夫みたいです。

例:php oil g model create_tests id:int name:varchar[25]

例の通りに入力すると

        Creating model: /fuel/app/classes/model/create/test.php
        Creating migration:/fuel/app/migrations/001_create_create_tests.php

こんな感じの文章が出てきたと思います。
modelフォルダにcreateフォルダを作成し、その中にtest.phpを作成。
migrationsフォルダに001_create_create_tests.phpを作成。

これでモデルとマイグレーションがそれぞれ作成されましたが・・・ちょっと不具合があるようで。
modelの方のtest.phpを見てみると

<?php

class Model_Create_Test extends \Orm\Model
{
	protected static $_properties = array(
		'id',
		'name'
		'created_at',
		'updated_at',
	);

	protected static $_observers = array(
		'Orm\Observer_CreatedAt' => array(
			'events' => array('before_insert'),
			'mysql_timestamp' => false,
		),
		'Orm\Observer_UpdatedAt' => array(
			'events' => array('before_update'),
			'mysql_timestamp' => false,
		),
	);
	protected static $_table_name = 'create_tests';

}

最初の方にある

	protected static $_properties = array(
		'id',
		'name'
		'created_at',
		'updated_at',
	);

この部分。
カラム名入力の時に入れた記憶のないcreated_atとupdated_atについては仕様です。
DBの都合上、いつ作成して、いつ更新したかという情報はあった方がいいのでデフォルトで入るようになってるみたいです。
作成時にオプションを追加することでこの部分を消すことも可能。一番後ろ --no-timestamp を入れると消えてくれます。

それとは別にarrayなのに'name'の後ろに,がついてないのにお気づきでしょうか。
ここはどうやらfuelPHPのバグらしいので自分で付け加えておきましょう。

次にmigrationsに作られたファイル。

<?php

namespace Fuel\Migrations;

class Create_create_tests
{
	public function up()
	{
		\DBUtil::create_table('tests', array(
			'id' => array('constraint' => 11, 'type' => 'int'),
			'name' => array('constraint' => 25, 'type' => 'varchar'),
			'created_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
			'updated_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),

		), array('id'));
	}

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

こちらは作られたマイグレーションのバージョン管理をするためのファイルになります。
ファイル名の頭に001とナンバリングされてる部分がそのままバージョンの数字です。
初めて作ったのであれば001。
そこからマイグレーションを追加するたび002、003と数字が増えていきます。

function up()内ではデータベースにtestsというテーブルを追加する処理をしています。
function down()ではtestsテーブルを削除する処理。

configフォルダのdb.phpの設定が済んでいる状態であればこの処理でデータベースのバージョンを上げ下げする事が出来るようになります。


バージョンの上げ下げについてはoilコマンドを使用。

oil refine migrate:up でバージョンアップ
oil refine migrate:down でバージョンダウン

refineを r と省略することも可能です。


とりあえずこんな感じ。

今回はmodelという書き方でマイグレーションの生成をしましたが、ここをscaffoldにするとmodelとmigrationに加え、controller、さらにViewsにCRUD機能を入れたページも作ってくれます。

CRUD:Create Read Update Deleteの頭文字を取ったDBの基本機能のこと。