FuelPHP マイグレーション(migration)とDBUtil
複数人で作業するときのDB/テーブルの情報共有(?)。各自でコマンドを叩けばDBの設定を書き換えるってヤツ
作成日:2019-10-28, 更新日:2023-07-20
基本
1.元になるファイルを作る
2.DB・テーブルに処理を行う
元になるファイルを作る
方法は二つあるっぽい。
・手書きでファイルを作る
・コマンドでファイルを作る
手書きでファイルを作る
・「app\migrations」の中にファイルを作る
・ファイル名は「001_〇〇〇」とし、以降は連番。
▼サンプル(app\migrations\001_create_comments.php)
<?php namespace Fuel\Migrations; class Create_comments { public function up() { \DBUtil::create_table('comments', array( 'id' => array('type' => 'int', 'constraint' => '11', 'unsigned' => true, 'null' => false, 'auto_increment' => true, ), 'post_id' => array('type' => 'int' 'constraint' => '11', 'null' => false, ), 'message' => array('type' => 'varchar', 'constraint' => '255', 'null' => false, ), 'created_at' => array('type' => 'int', 'constraint' => '11', 'unsigned' => true, 'null' => true, ), 'updated_at' => array('type' => 'int', 'constraint' => '11', 'unsigned' => true, 'null' => true, ), ), array('id')); } public function down() { \DBUtil::drop_table('comments'); } }
コマンドでファイルを作る
・コンソールでコマンドを叩くと「app\migrations」の中にファイルが作られる
▼叩くコマンド
oil generate migration テーブル名 各情報
▼サンプル
php oil generate migration create_comments post_id:integer message:string
※「oil」のあるトコにカレントを移して、PHPでoilを実行させる場合
DB・テーブルに処理を行う
・コンソールでコマンドを叩くと「app\migrations」の中のファイルに従って色々としてくれる
▼叩くコマンド
oil refine migrate
▼サンプル
php oil refine migrate
※「oil」のあるトコにカレントを移して、PHPでoilを実行させる場合
初めて「oil refine migrate」をするとき
▼「oil refine migrate」を実行すると下記2ファイルが作られる
・「app\config\〇〇〇\migrations.php」が作られる
・「テーブル:migration」が作られる
各コマンド
▼実行
$ php oil refine migrate
▼一つ前に戻す
$ php oil refine migrate:down
▼最初に戻す(初期化:バージョンを「0」まで戻す)
$ php oil refine migrate:down -v=0
※「002_xxx.php」まで戻す(「003_xxx.php」以降の処理をキャンセル)場合は「v=2」
▼一つ先に進める(※downの反対)
$ php oil refine migrate:up
▼指定分進める(※downの反対)
$ php oil refine migrate:down -v=10
「app\migrations\xxx.php」の中の「DBUtil」
▼サンプル
\DBUtil::create_table( 'users', // 【必須】テーブル名 array( // 【必須】フィールドを含む配列 'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true), 'name' => array('type' => 'text'), 'email' => array('constraint' => 50, 'type' => 'varchar'), 'title' => array('constraint' => 50, 'type' => 'varchar', 'default' => 'mr.'), 'password' => array('constraint' => 125, 'type' => 'varchar'), ), array('id'), // プライマリキーを含む配列 false, // IF NOT EXISTS を使うかどうか 'InnoDB', // どのストレージエンジン (MyISAM, InnoDB, ...) を使うか 'utf8_unicode_ci', // デフォルトの文字セット。指定しないとアクティブな DB グループの文字セットが使われる array( // 外部キー制約の定義を含む配列。配列のキーとして 'key' と 'reference' が必要で、これらがないとエラーが発生する。それ以外は任意指定。 array( 'constraint' => 'constraintA', 'key' => 'keyA', 'reference' => array( 'table' => 'table', 'column' => 'field', ), 'on_update' => 'CASCADE', 'on_delete' => 'RESTRICT' ), array( 'key' => 'keyB', 'reference' => array( 'table' => 'table', 'column' => array( 'fieldA', 'fieldB' ), ), ), ), );
指定可能なパラメータ
name | フィールド名 |
---|---|
type | フィールドの型 (varchar, enum, text, ...) |
constraint | 長さ。配列で指定することも可能 |
charset | 文字セット |
unsigned | boolean 値で、符号なしの時は true 。デフォルトは false |
default | デフォルト値 |
null | boolean 値で、null を許可する時は true 。デフォルトは false |
auto_increment | オートインクリメントを使う時は true に設定する |
comment | フィールドにコメントを追加する |
▼サンプル
\DBUtil::create_table('users', array( 'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true), 'name' => array('type' => 'text'), 'email' => array('constraint' => 50, 'type' => 'varchar'), 'title' => array('constraint' => 50, 'type' => 'varchar', 'default' => 'mr.'), 'created' => array('type' => 'timestamp', 'default' => \DB::expr('CURRENT_TIMESTAMP')), 'password' => array('constraint' => 125, 'type' => 'varchar'), ), array('id'));
めも
カラム操作
・「if(DBUtil::field_exists(テーブル名, array(カラム名))){}」で条件分岐
・\DBUtil::add_fields(テーブル名, カラムの情報)
・\DBUtil::drop_fields(テーブル名, カラム名)
・\DBUtil::modify_fields(テーブル名, カラムの情報)
インデックス(ユニークキー等)
・「\DBUtil::create_index(テーブル名, array(カラム名), インデックス名, インデックスタイプ);」
・「\DBUtil::drop_index(テーブル名, インデックス名);」
※インデックスタイプは「UNIQUE、FULLTEXT、SPATIAL、NONCLUSTERED」のいずれか。