CakePHP3でカラム設定を変更したい

テーブルを作成した後に、カラム設定を変更したいってことありますよね。

文字数を変更したいとか、データ型を変更したいとか。

当たり前のことなのですが、割とあります。

今回はその方法について説明していきます。

(目次)

【自分の環境】

macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

マイグレーションコマンドをする

まずはマイグレーションコマンドです。

macOSの場合で説明しますが、以下のようなかんじです。

./bin/cake bake migration ChangeUsers

この例ではUsersテーブルを変更したいとしてます。

マイグレーションファイル名をChangeUsersとしてみました。

正直ネーミングは何でもいいと思います。

public function change()
    {
    }

上記のようなマイグレーションファイルができています。

ここに以下を書き足します。

public function change()
    {
           $table = $this->table('users');
           $table->changeColumn('age', 'integer', [ 'limit' => 2]);
           $table->update();
    }

この例ではusersテーブルのageカラムをinteger型の文字の長さ2にしようとしています。

まず$table = $this->table('users');でテーブルを宣言し、変更内容を挟み、$table->update();で締めます。

これはこれで動きます。

ですが、②であることをすると、ロールバック(操作の巻き戻し)ができるようになります。

②up()とdown()に書き換えることでロールバックできるようにする

現状では、

public function change()
    {
           $table = $this->table('users');
           $table->changeColumn('age', 'integer', [ 'limit' => 2]);
           $table->update();
    }

こうなっています。

ロールバックできるようにしたいです。

そこでこれを

public function up()
    {
           $table = $this->table('users');
           $table->changeColumn('age', 'integer', [ 'limit' => 2]);
           $table->update();
    }

public function down()
    {
           $table = $this->table('users');
           $table->changeColumn('age', 'string', [ 'limit' => 3]);
           $table->update();
    }

にすると、ロールバックできるようになります。

この例ではデータ型をstring→integerにして、文字の長さを3→2にしています。

ポイントは2つです。

①ファンクションup()に変更後の内容を書くこと

②ファンクションdown()に変更前の内容を書くこと

です。

これでロールバックできるようになります。

逆に言うと、ファンクションchange()ではロールバックできないということですね。

終わりに

以上となります。

慎重に書けばあまりロールバックすることはないですが、仕様変更だったりミス表記はありうるので、個人的にはぜひ覚えておきたい部分です。

以下のサイトを参考にさせていただきました。

CakePHP3のMigration(マイグレーション)でカラム追加・変更・削除を行う

ありがとうございました。