FuelPHPのMagic Migrationsがうまく動作しないことがあったので調査した


FuelPHPのMagic Migrationsがうまく動作しない現象に悩まされたので、どのような状況で発生するのか検証しました。まだソースコードを追えていないので、ひとまず検証結果をメモしておきます。

結論から言うと、table_prefixを指定した状態で、ドライバがPDOだった場合、テーブルの削除 oil generate migration drop_tablenameと、フィールド名の変更 oil generate migration rename_field_oldname_to_newname_in_tablenameが思うように機能しませんでした。

開発環境

環境は以下の通りで、各種ソフトウェアはインストール済みという前提で進めます。パスやバージョン等は、必要に応じて読み替えてください。

ソフトウェアバージョン備考
MAMP2.0.5
MySQL5.5.9MAMPのMySQLを使うものとする
PHP5.3.6MAMPのPHPを使うものとする
FuelPHP1.3/User/username/work/fuelphp に配置しているとする *

* usernameには、Macのユーザ名が入ります。

Magic Migrations について

検証を行う前にマジックマイグレーションについて確認をします。

There are a number of “magic” migrations which automatically build you a migration based on a prefix to your migration name.

引用元:Magic Migrations : Generate – Oil Package – FuelPHP Documentation

上記にある通り、マジックマイグレーションとは、マイグレーション名のプレフィックスに基づいて、自動的にマイグレーションを構築するFuelPHPの機能のことです。例えば、以下のようなものです。赤い部分に基づいて自動的にマイグレーションを構築します。

# テーブルの作成
oil generate migration create_users name:text email:string[50] password:string[125] memo:text
# テーブル名の変更
oil generate migration rename_table_users_to_accounts
# フィールドの追加
oil generate migration add_bio_to_accounts bio:text
# フィールド名の変更
oil generate migration rename_field_name_to_username_in_accounts
# テーブルの削除
oil generate migration drop_accounts

検証

以下の4つのパターンを検証しました。

  1. table_prefix:なし / ドライバ:PDO
  2. table_prefix:なし / ドライバ:mysqli
  3. table_prefix:あり / ドライバ:PDO
  4. table_prefix:あり / ドライバ:mysqli

パターン1 – table_prefix:なし / ドライバ:PDO

こちらはFuelPHPの初期設定です。結果は以下の通りで、期待通りの動作となりました。

パターン2 – table_prefix:なし / ドライバ:mysqli

ドライバをmysqliに変更して検証します。 db.phpを以下のように修正しました。結果はパターン1と全く同じでしたので割愛します。
参考リンク:Database Introduction – Class – FuelPHP Documentation

パターン3 – table_prefix:あり / ドライバ:PDO

ドライバをPDOに戻し、 'table_prefix' => 'pr_'を追記しました。

oilコマンドでマイグレーションの構築を行ったところ、フィールド名の変更とテーブルの削除でエラーが出てしまいました。エラーメッセージを見ると、プレフィックスがついていないため、テーブルを見つけることができていないようです。

パターン4 – table_prefix:あり / ドライバ:mysqli

ドライバをmysqliに変更して実行したところ、table_prefixを指定した状態でも正常に終了しました。結果はパターン1と全く同じでしたので割愛します。

検証結果

table_prefixを指定した状態で、ドライバがPDOだった場合、テーブルの削除と、フィールド名の変更が失敗することがわかりました。

 ドライバ:PDOドライバ:mysqli
table_prefix:なし
table_prefix:あり×

MySQLのクエリログを見てみると、ドライバがPDOの時は、プレフィックスがつけられていないことが見て取れます。
参考リンク:MAMPでMySQLのクエリログを出力する

とりあえず、ここまで。どうすればPDOでもMagic Migrationsを完全に利用できるようになるのかは、時間があるときにでも調査してみたいと思います。それまでは、table_prefixを指定した状態で、Magic Migrationsを使う場合は、ドライバをmysqliにすることで対応します。