ちょっとPhalconを使わなければならない状態になったので、使ってみているのですが、 Phalcon結構素直でいいFWだと思います。
Phalconはだんだん好きになってきたのですが、
この案件今まで一人でやっていたらしく、migrationとか使ってないといわれました。
そんじゃPhalconMigrationでもつかうかと気軽におもったのですが
資料がない。
あってもup系の記事や記述ばかりでdownどうすんねん!!
ってのがわからなかったのでしょうがないからソースを読んでやっとわかったので、
同じ轍を踏んでいる人が少しでも参考になるように記載しておきます。
とりあえずソースよませろや!って方はこちらを読めば大体挙動がわかると思います。
GitHubは偉大
github.com
・テーブルはわかりやすいようにmigration_testを指定していますが指定しなければALLになります
・configを環境ごとに分けている場合は--configオプションにconfigのパスを指定してください
・初期generateします
$ phalcon migration generate --config=./app/config/config_local.php ~skip Success: Version 1.0.0 was successfully generated
app/migrations/1.0.0が出来上がりました
これはすべてのテーブル情報が含まれています。
・migration_testテーブルを作成します
こんなテーブルにしました。
・migration_testテーブルだけgenerateします
$ phalcon migration generate --config=./app/config/config_local.php --table=migration_test ~skip Success: Version 1.0.1 was successfully generated
app/migrations/1.0.1ができあがりました。
さて、この1.0.1でテーブルをつくったのだから、1.0.0にロールバックした時にはこのテーブルは消えてほしいので
app/migrations/1.0.1/migration_test.phpのmorph()内のソースをupにコピーして、downにdropTableの記述をします
これはrun時にはmorph() -> up()と処理が走り、rollback時には down() -> morph()と処理が走っているので、
morph() に書いたままだと、downで消したテーブルをmorphが作り直してしまうためです
<?php use Phalcon\Db\Column; use Phalcon\Db\Index; use Phalcon\Db\Reference; use Phalcon\Mvc\Model\Migration; /** * Class MigrationTestMigration_101 */ class MigrationTestMigration_101 extends Migration { /** * Define the table structure * * @return void */ public function morph() { } /** * Run the migrations * * @return void */ public function up() { $this->morphTable('migration_test', array( 'columns' => array( new Column( 'id', array( 'type' => Column::TYPE_INTEGER, 'unsigned' => true, 'notNull' => true, 'autoIncrement' => true, 'size' => 11, 'first' => true ) ), new Column( 'name', array( 'type' => Column::TYPE_VARCHAR, 'default' => "", 'notNull' => true, 'size' => 128, 'after' => 'id' ) ) ), 'indexes' => array( new Index('PRIMARY', array('id'), null) ), 'options' => array( 'TABLE_TYPE' => 'BASE TABLE', 'AUTO_INCREMENT' => '1', 'ENGINE' => 'InnoDB', 'TABLE_COLLATION' => 'utf8_general_ci' ), ) ); } /** * Reverse the migrations * * @return void */ public function down() { self::$_connection->dropTable('migration_test'); } }
1.0.0にロールバックします
downは--versionオプションで前バージョンに戻した際に呼び出されます。
$ phalcon migration run --config=./app/config/config_local.php --version=1.0.0 ~ skip Success: Version 1.0.0 was successfully migrated
migration_testテーブルが消えていれば成功です
例えばageカラムを追加した場合のdownはこのように記述します
<?php use Phalcon\Db\Column; use Phalcon\Db\Index; use Phalcon\Db\Reference; use Phalcon\Mvc\Model\Migration; /** * Class TestMigrationMigration_102 */ class TestMigrationMigration_102 extends Migration { /** * Define the table structure * * @return void */ public function morph() { } /** * Run the migrations * * @return void */ public function up() { $this->morphTable('test_migration', array( 'columns' => array( new Column( 'id', array( 'type' => Column::TYPE_INTEGER, 'unsigned' => true, 'notNull' => true, 'autoIncrement' => true, 'size' => 11, 'first' => true ) ), new Column( 'name', array( 'type' => Column::TYPE_VARCHAR, 'notNull' => true, 'size' => 128, 'after' => 'id' ) ), new Column( 'age', array( 'type' => Column::TYPE_INTEGER, 'size' => 11, 'after' => 'name' ) ) ), 'indexes' => array( new Index('PRIMARY', array('id'), null) ), 'options' => array( 'TABLE_TYPE' => 'BASE TABLE', 'AUTO_INCREMENT' => '1', 'ENGINE' => 'InnoDB', 'TABLE_COLLATION' => 'utf8_general_ci' ), ) ); } /** * Reverse the migrations * * @return void */ public function down() { $this->morphTable('test_migration', array( 'columns' => array( new Column( 'id', array( 'type' => Column::TYPE_INTEGER, 'unsigned' => true, 'notNull' => true, 'autoIncrement' => true, 'size' => 11, 'first' => true ) ), new Column( 'name', array( 'type' => Column::TYPE_VARCHAR, 'notNull' => true, 'size' => 128, 'after' => 'id' ) ) ), 'indexes' => array( new Index('PRIMARY', array('id'), null) ), 'options' => array( 'TABLE_TYPE' => 'BASE TABLE', 'AUTO_INCREMENT' => '1', 'ENGINE' => 'InnoDB', 'TABLE_COLLATION' => 'utf8_general_ci' ), ) ); } }
これやり方違うよ!とかご意見マサカリお待ちしています!