FuelPHP での Migration の使い方 (2)

FuelPHP での Migration の使い方 で説明されていない項目について補足します。

デフォルト値を設定する

フィールドの指定に default[デフォルト値] を追加します。

$ oil g migration create_table1 title:string[50]:default[abc]

生成されるファイルは以下のようになります。

<?php

namespace Fuel\Migrations;

class Create_table1
{
	public function up()
	{
		\DBUtil::create_table('table1', array(
			'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),
			'title' => array('constraint' => 50, 'type' => 'varchar', 'default' => 'abc'),
			'created_at' => array('constraint' => 11, 'type' => 'int'),
			'updated_at' => array('constraint' => 11, 'type' => 'int'),
		), array('id'));
	}

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

ただし、oil コマンドの引数に与えられる文字は制限されていますので、許可されない文字を指定した場合は、期待するコードが生成されません。

ということで、「oil r migrate」を実行する前に、生成されたコードを確認するようにしましょう。

migrate を実行し作成されたテーブルの定義は、例えば、以下のようになります。

CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) NOT NULL DEFAULT 'abc',
  `created_at` int(11) NOT NULL,
  `updated_at` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

NULL にする

フィールドの指定に null を追加します。

$ oil g migration create_table1 title:string[50]:null

生成されるファイルは以下のようになります。

<?php

namespace Fuel\Migrations;

class Create_table1
{
	public function up()
	{
		\DBUtil::create_table('table1', array(
			'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),
			'title' => array('constraint' => 50, 'type' => 'varchar', 'null' => true),
			'created_at' => array('constraint' => 11, 'type' => 'int'),
			'updated_at' => array('constraint' => 11, 'type' => 'int'),
		), array('id'));
	}

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

migrate を実行し作成されたテーブルの定義は、例えば、以下のようになります。

CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) DEFAULT NULL,
  `created_at` int(11) NOT NULL,
  `updated_at` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

インデックスを付ける

現在の oil コマンドではできません。

ただし、FuelPHPマイグレーションは結局、fuel/app/migrations/ にデータベースを操作するクラスを作成しているだけですので、そのファイルを修正すればいいだけです。

必要なメソッドは、ドキュメント

を参照します。

例えば、以下のようにしてファイルを生成します。

$ oil g migration create_table1 title:string[50]

すると、以下のファイルが生成されます。

<?php

namespace Fuel\Migrations;

class Create_table1
{
	public function up()
	{
		\DBUtil::create_table('table1', array(
			'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true),
			'title' => array('constraint' => 50, 'type' => 'varchar'),
			'created_at' => array('constraint' => 11, 'type' => 'int'),
			'updated_at' => array('constraint' => 11, 'type' => 'int'),
		), array('id'));
	}

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

上記のファイルにインデックスを追加するコードを追加します。

--- a/fuel/app/migrations/004_create_table1.php
+++ b/fuel/app/migrations/004_create_table1.php
@@ -12,6 +12,8 @@ class Create_table1
            'created_at' => array('constraint' => 11, 'type' => 'int'),
            'updated_at' => array('constraint' => 11, 'type' => 'int'),
        ), array('id'));
+
+       \DBUtil::create_index('table1', 'title', 'idx_title');
    }
 
    public function down()

そして、migrate を実行します。

以下のようなテーブルが作成されます。

CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) NOT NULL,
  `created_at` int(11) NOT NULL,
  `updated_at` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;