ラボ > FuelPHP:OIL、DB関連

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」のいずれか。

公式

DBUtil クラス