目次

, ,

PHP Phinx でデータベースマイグレーション

公式

公式のページからドキュメントは CakePHP のドキュメントサイトに飛びます。CakePHP のドキュメントサイトは日本語訳を表示することができます。

インストール

既に存在するマイグレーションを行う対象のプロジェクトに composer を使ってインストールします。

php composer.phar require robmorgan/phinx

コマンドの実行

各種コマンドは vendor/bin/phinx を使って行います。

マイグレーションの初期化

vendor/bin/phinx init

上記はマイグレーション初期化のコマンドでプロジェクトのルートディレクトリ直下に db/migrations フォルダを作成します。

マイグレーションクラスの作成

vendor/bin/phinx create SomeMigrationClassName

このコマンドを実行すると db/migrations フォルダに YYYYMMDDHHMMSS_some_migration_class_name.php というファイルが出来ます。
作成されたファイルに書かれたコマンドをファイル名の日付順に実行することによって、テーブルの操作を行います。

このファイル名をどう決めるかはかなり重要になってきます。ファイル名に含める要素は、操作対象のテーブル、操作対象の内容、操作を行う理由、などが考えられます。

などでしょうか。これ以上の細かい内容は、コード中や Git のコメントで補う形になるでしょう。

その他、以下の様なコマンドが用意されています。なお、以下のコマンドの共通のオプションとしては、コマンドを反映する環境を -e ENVIRONMENT オプションで指定できます。

vendor/bin/phinx migrate -e production SomeMigrationClassName

マイグレーションクラスの編集

<?php
declare(strict_types=1);
 
use Phinx\Migration\AbstractMigration;
 
final class AttendancesMigration extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change(): void
    {
        $table = $this->table('attendances');
        $table->addColumn('work_on',    'date')
              ->addColumn('user',       'string')
              ->addColumn('name',       'string',   ['null' => true])
              ->addColumn('begin_at',   'string',   ['null' => true])
              ->addColumn('end_at',     'string',   ['null' => true])
              ->addColumn('created_at', 'datetime')
              ->addColumn('created_by', 'string',   ['null' => true])
              ->addColumn('updated_at', 'datetime')
              ->addColumn('updated_by', 'string',   ['null' => true])
              ->addColumn('deleted_at', 'datetime', ['null' => true])
              ->addColumn('deleted_by', 'string',   ['null' => true])
              ->addIndex(['work_on', 'user'], ['unique' => true, 'name' => 'UNQ_work_on__user'])
              ->save();
    }
}