FuelPHP 複数データベースへの migration


FuelPHP で複数データベースへ migration を行うやり方を説明します。 FuelPHP 1.7.2 を想定しています。

FuelPHP では php oil g model item name:string などのようにすると、 model と migration のためのコードが生成されます。 php oil g scaffold ... とやった場合にも migration のコードが生成されます。 ここで生成される migration コード に手を加えることで 複数データベースに対応させることができます。

変更前のコード

<?php

namespace Fuel\Migrations;

class Create_items
{
	public function up()
	{
		\DBUtil::create_table('items', array(
			'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true, 'unsigned' => true),
			'name' => array('constraint' => 255, '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('items');
	}
}

変更後のコード

<?php

namespace Fuel\Migrations;

class Create_items
{
	public function up()
	{
		\DBUtil::create_table('items', array(
			'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true, 'unsigned' => true),
			'name' => array('constraint' => 255, 'type' => 'varchar'),
			'created_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
			'updated_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),

		), array('id'), true, false, null, array(), 'db_config_key');
	}

	public function down()
	{
		\DBUtil::drop_table('items', 'db_config_key');
	}
}

db_config_key というのを付け加えました。 このパラメータでデータベースを指定できます。 具体的には config/db.php 内 のキーになります。 たとえば 'default' なんてのが入ります。 何も指定がなければ 'default' が採用されます。

このようにして複数データベースに対応させることができます。 migration の コードごとに データベースを書き換えればいいですからね。

Model の コードを活用した書き方

Model を利用してやってみましょう。

<?php
  
  namespace FuelMigrations;
  
  class Create_items
  {
  	public function up()
  	{
  		DBUtil::create_table(Model_Item::table(), array(
  			'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true, 'unsigned' => true),
  			'name' => array('constraint' => 255, 'type' => 'varchar'),
  			'created_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
  			'updated_at' => array('constraint' => 11, 'type' => 'int', 'null' => true),
  
  		), Model_Item::primary_key(), true, false, null, array(), Model_Item::connection());
  	}
  
  	public function down()
  	{
  		DBUtil::drop_table(Model_Item::table(), Model_Item::connection());
  	}
  }

Model_ItemOrm を使っているという前提の話ですが、 データベースの指定に Model_Item::connection() を、 テーブルの指定に Model_Item::table() を、 主キーの指定に Model_Item::primary_key() を使っています。 このようにすると、 model の中に書いておけば migration のコードを変更しなくても済みます。 (ただし 既存テーブルについて model の テーブル名や $_connection を変更する場合には注意が必要になります。)