LoginSignup
6
5

More than 5 years have passed since last update.

php7.1以降のfuelphp1.8 でDBからmigrationファイル生成

Posted at

現在
PHP:7.1.1
fuelphp:1.8
で開発中

後付で自動化とか諸々を目論んでいる中、DBからmigrationファイルを作りたくなったので当然できるよなという考えの元に色々調べたらできるらしいことがわかった。

下記で本来ならできるはず

$ php oil r fromdb:model (テーブル名)

え、別にmodelいらないとおもったが、model部分をmigrationにすればmigrationファイルだけ生成できる。

$ php oil r fromdb:migration (テーブル名)

はずだったが、うわさではPHP7.1からの仕様変更により文字列と数字を合算したりするとエラーが出るらしい。
わ〜い、当たり前。

$ php oil r fromdb:migration (テーブル名)
Uncaught exception Fuel\Core\PhpErrorException: A non-numeric value encountered
Callstack: 
#0 /fuel/core/bootstrap.php(103): Fuel\Core\Errorhandler::error_handler(2, 'A non-numeric v...', '/Applications/M...', 1790)
#1 /fuel/packages/oil/classes/generate.php(1790): {closure}(2, 'A non-numeric v...', '/Applications/M...', 1790, Array)
#2 /fuel/packages/oil/classes/generate.php(1177): Oil\Generate::_find_migration_number()
#3 /fuel/packages/oil/classes/generate.php(747): Oil\Generate::migration(Array, false)
#4 [internal function]: Oil\Generate::model(Array)
#5 /fuel/packages/oil/tasks/fromdb.php(155): call_user_func('Oil\\Generate::m...', Array)
#6 /fuel/core/base56.php(37): Fuel\Tasks\Fromdb::model(Array)
#7 /fuel/packages/oil/classes/refine.php(108): call_fuel_func_array(Array, Array)
#8 [internal function]: Oil\Refine::run('\\Fuel\\Tasks\\Fro...', Array)
#9 /fuel/packages/oil/classes/command.php(126): call_user_func('Oil\\Refine::run', 'fromdb:model', Array)
#10 /oil(68): Oil\Command::init(Array)
#11 {main}

というわけでfuelphpの中身を軽く修正。
/fuel/packages/oil/classes/generate.php(1790)こいつが怪しいので該当箇所を見る。

return str_pad($last + 1, 3, '0', STR_PAD_LEFT);

上記を

return str_pad((int)$last + 1, 3, '0', STR_PAD_LEFT);

こうして動かしてみた。

$ oil r fromdb:migration (テーブル名)
        Creating migration: /fuelphp/fuel/app/migrations/001_table_name.php

できた〜。

応急処置が過ぎるので正式な対応かどうかわからない。
なんか問題あれば教えてください。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5