とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

Phalcon Migrations Tips

ちょっと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テーブルを作成します

f:id:raharu0425:20161201134940p:plain

こんなテーブルにしました。

・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'
                ),
            )
        );

    }

}

これやり方違うよ!とかご意見マサカリお待ちしています!