Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
48
Help us understand the problem. What is going on with this article?
@ichigotake

[phpmig]PHPでマイグレーション

More than 5 years have passed since last update.

phpmig

簡単に実行できる、ベンダーやフレームワークへの依存の少ないPHPのマイグレーションツール
(READMEから意訳

ここに書いてあるメモは全部READMEに書いてある

後々確実にお世話になるので今のうちに軽く触れてめもめも

参考

インストールから初期化まで

PEARかcomposerを利用してphpmigをインストール

composerでのインストールがベストらしい

composerでインストール

プロジェクト用にローカライズされたphpmigが利用できるようになる(直訳

$ cd /path/to/project
$ echo <<EOT > composer.json
{
    "require": {
        "php": ">=5.3.1",
            "davedevelopment/phpmig": "*"
    },

        "config": {
            "bin-dir": "bin/"
        }
}

$ wget http://getcomposer.org/composer.phar
$ php composer.phar install

PEARでインストール

PEAR 1.0用のパッケージはないらしい

$ sudo pear channel-discover pear.atstsolutions.co.uk
$ sudo pear install atst/phpmig-alpha

初期化

PEARでインストールした場合はbin/phpmigphpmigに置き換わる

$ cd /path/to/project
$ phpmig init

簡単な動作確認を兼ねてバージョンチェック

$ bin/phpmig --version

簡易チートシート

マイグレーション実行時はup()メソッド、ロールバック時にはdown()メソッドが呼び出される

コマンド実行前後に$ bin/phpmig statusで確認しながらやると感覚が掴みやすいかもしれない

  • マイグレーション用の雛形を生成

./migrationディレクトリに作成される

$ bin/phpmig generate AddRatingToLolCats ./migrations/
  • ステータス確認

down: 未実行
up: 実行済み

$ bin/phpmig status
  • マイグレーション実行

/migrationディレクトリ内のファイルが順次実行される

$ bin/phpmig migration
  • 1つ戻る
$ bin/phpmig rollback
  • 全て戻る
$ bin/phpmig rollback -t 0
  • 指定のMigration IDの完了時点まで戻る
$ bin/phpmig rollback [MigrationID]
  • 指定のMigration IDのみをup or down
$ bin/phpmig [up|down] [MigrationID]

データベースの接続とか

bin/phpmig initで生成されるphpmig.phpの$container['db']にDBアダプターを入れてやるとmigrations/内のクラスでDBが扱えるようになる
他にも、$containerの配列の要素にオブジェクトなりを入れればmigrations/内で使えるようになる

下の例で行くと、migrations/内で$container['db']や$container['app']が使えるようになる

<?php //phpmig.php

$application = new Zend_Application(
    APPLICATION_ENV,
    $app_ini
);

use \Phpmig\Adapter,
    \Phpmig\Pimple\Pimple;

$container = new Pimple();

$container['app'] = $application;
$container['db'] = Zend_Db::factory($adapterName, $params);

$container['phpmig.adapter'] = $container->share(function () {
    // replace this with a better Phpmig\Adapter\AdapterInterface 
    return new Adapter\File\Flat(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/.migrations.log');
});

$container['phpmig.migrations'] = function() {
    return glob(__DIR__ . DIRECTORY_SEPARATOR . 'migrations/*.php');
};

return $container;

migrations/内のクラスからphpmig.phpの$containerを呼び出すには、$this->getContainer()を利用する

<?php // ./migrations/20130217150827_AddSomeTableMigration.php

use Phpmig\Migration\Migration;

class AddSomeTableMigration extends Migration
{
    /** 
     * Do the migration
     */
    public function up()
    {   
        $container = $this->getContainer();
        $container['db']->query('CREATE TABLE IF NOT EXISTS some_table ( id int )');
    }   


    /** 
     * Undo the migration
     */
    public function down()
    {   
        $container = $this->getContainer();
        $container['db']->query('DROP TABLE IF EXISTS phpmig_test');
    }
}
48
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ichigotake
ちっちゃいものがすき

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
48
Help us understand the problem. What is going on with this article?