マイグレーションファイルのあれやこれ

10月も半ばに差し掛かりましたが、暑がりゆえに衣替えのタイミングを逃し続けています。皆様いかがお過ごしでしょうか。
今回はcakephpでのマイグレーションファイルについて、よく忘れて同じことを繰り返し調べてしまうので自分用にまとめてみようと思いました。

MigrationsとSeeds

「さぁ~て、cakephpですか!DBはどないなっとるんかな!」こんな時に確認したり作成したりするのがマイグレーションファイルとシードファイル。どちらもデータベースにあれこれするという意味では同じようなものですが、もちろん用途は異なります。ごっちゃになってしまうのでメモメモ。。。

  • Migrations:テーブルを作ったり消したり、テーブルのカラムをあれこれしたりするやつ
  • Seeds:テーブルにデータを入れたり消したり、データを書き換えたりするやつ

今日の備忘録はマイグレーションに焦点を当てるので、Seedsさんはまた日を改めて…(まとめるほどの内容があれば…)

本題①:マイグレーションを実行どうのこうの

公式のレファレンス見ればまあ書いてあることには書いてあるんですが、いつもサイト内で迷子になるんで知りたいことだけここに列挙していこう大作戦です。

やりたいことこうする
マイグレーションファイル作るコマンドbin/cake migrations create マイグレーション名 
マイグレーション今どないなっとるんやbin/cake migrations status
実行したいbin/cake migrations migrate
戻したいbin/cake migrations rollback
コマンド一覧になってしまった

気を付けておくこと

  • 引数のマイグレーション名はキャメルケース、ゼッタイ。
  • ファイル名は、作成日時(YYYYMMDDHHMMSS)_マイグレーション名.php
  • マイグレーションファイルは config/Migration/ 以下に作成されるので、
    「ディレクトリちゃうねんな…」ってときはオプション【–source 指定ディレクトリ】を書き足しましょう。
  • やめろ~!全部せんでええ!これだけやってほしいんや!というとき
    【–target 対象マイグレーションの作成日時(YYYYMMDDHHMMSS)】を書き足しましょう。

本題②:ファイルの中身どうのこうの

実行の仕方はわかった、肝心の実行する中身ってどうなってんの?という話も忘れる前に残しておかないとですね。
作成コマンドを実行すると、change()という空っぽのメソッド一つぽつんとしたファイルが出来上がっています。このメソッドも便利みたいですが、わかりやすさという意味ではchange()はサヨナラしてup()&down()で構えておいたほうが安心かと思います。
メソッド名で察しもつくでしょうが、実行したいコマンドでup()、戻してコマンドでdown()が実行されるというわけです。
例として、「テーブルの作成」「カラムの追加」を見ていきましょう。まずはup()から。

<?php

use Phinx\Migration\AbstractMigration;

class Migrations extends AbstractMigration {

    public function up() {
        $this->table('users')
            ->addColumn('id', 'biginteger', [
                'autoIncrement' => true,
                'default' => null,
                'limit' => 20,
                'null' => false,
            ])
            ->addColumn('name', 'text', [
                'default' => null,
                'limit' => null,
                'null' => false,
            ])
            ->create();
        
        $this->table('addresses')
            ->addColumn('mail', 'text', [
                'default' => null,
                'limit' => null,
                'null' => false,
            ])
            ->update();
    }
}

例なので適当ですが、up()内の一つ目はidとnameだけのカラムを持つusersテーブルを作ろうとしています。二つ目は既にaddressesテーブルがあるという体で、新しいカラムmailを追加しようとしていますね。
マイグレーションを実行すると、これらの処理が実行されるわけです。
ではdown()はどうでしょう。up()でしようとしていることは 「usersテーブルの作成」「addressesテーブルにカラムの追加」でした。

<?php

use Phinx\Migration\AbstractMigration;

class Migrations extends AbstractMigration {

    public function down() {
        $this->table('users')
            ->drop();
        
        $this->table('addresses')
            ->removeColumn('mail')
            ->update();
    }
}

down()ではrollbackすなわち元に戻す処理を行いたいので「usersテーブルの削除」「addressesテーブルから指定カラムの削除」を記述します。
実行時と戻すときとで二つ分の処理を書かなくてはいけないので少々面倒かもしれませんが、このほうが一目見てわかるじゃん!と個人的には思っております。
ひとつの操作で一つの処理、テレビのリモコンなんかでひとつのボタンに複数機能があると詰むタイプの人間だからでしょうか…。

備忘録らしくある程度まとまったんじゃないでしょうか、よしよし。