CakePHP4でマイグレーションして、テーブルを作成する

2020年12月1日

CakePHPがバージョン4になってから、初めてCakePHP4を触ってみています。
バージョン4になって、スタートページのデザインに綺麗になりました。

CakePHP4.1.5

今回は、CakePHPでマイグレーションをして、テーブルを作成する方法を紹介します。
本記事では2020年10月現在の最新版であるCakePHP4.1.5を使用しています。

マイグレーションの準備

CakePHPのマイグレーションにはプラグインが用意されているので、以下のコマンドを実行して読み込みを行います。

bin/cake plugin load Migrations

読み込みを行うと、src/Application.phpに以下の記述が追加されます。

$this->addPlugin('Migrations');

これでマイグレーションの準備が完了です。

マイグレーションファイルの作成

マイグレーションファイルの作成には、bakeコマンドが利用できます。
以下のようにコマンドを実行すると、マイグレーションファイルが作成されます。

bin/cake bake migration CreateUsers email:string nickname:string[50] password:string[100] auth:integer? registration_flag:integer deleted:boolean created modified

マイグレーションファイルは、config/Migrationに作成されます。

マイグレーションファイル作成コマンドの形式

コマンドは以下の形式で入力します。

作成するテーブル名を記述

bin/cake bake migration CreateUsers

「CreateUsers」という部分が作成するテーブル名の記述です。
テーブルを作成する場合は、「Create」と先頭に付け、その後にテーブル名を記述します。
本記事の例だと、「users」というテーブルを作成する例となります。

作成するテーブルのカラムを記述

email:string nickname:string[50] password:string[100] auth:integer? registration_flag:integer deleted:boolean created modified

作成するテーブルのカラムを半角スペース区切りで記述します。

カラムの記述は「カラム名:型」の形式になります。
「email:string」と記述した場合は、カラム名が「email」型が「string」となります。

使用できる型は以下の種類があります。

  • string
  • text
  • integer
  • biginteger
  • float
  • decimal
  • datetime
  • timestamp
  • time
  • date
  • binary
  • boolean
  • uuid

型は、実際にテーブルを作成する時にデータベースの型にあったものに変換され、MySQLの場合「string」は「VARCHAR」で作成されます。

カラムの長さを指定することも可能です。
nickname:string[50] のように指定すると、VARCHAR(50)のカラムとなります。
長さを指定しない場合は、それぞれの型の最大値で作成され、VARCHARの場合は255で作成されます。

NULLを許容するか、も指定可能です。
auth:integer? と型の後にクエスチョンマークを付けると、NULL許容のカラムになります。
クエスチョンマークを付けない場合はNULLを許可しないとなります。

主キーはカラム名がidとなり、暗黙的に追加されるので、記述は不要です。

カラム名が「created」「modified」の場合は自動的にdatetime型となるため、型の指定は不要です。

作成されたマイグレーションファイル

コマンドが正常に実行されると、以下のようなマイグレーションファイルが作成されます。

<?php
declare(strict_types=1);

use Migrations\AbstractMigration;

class CreateUsers extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
     * @return void
     */
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('email', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('nickname', 'string', [
            'default' => null,
            'limit' => 50,
            'null' => false,
        ]);
        $table->addColumn('password', 'string', [
            'default' => null,
            'limit' => 100,
            'null' => false,
        ]);
        $table->addColumn('auth', 'integer', [
            'default' => null,
            'limit' => 11,
            'null' => true,
        ]);
        $table->addColumn('registration_flag', 'integer', [
            'default' => null,
            'limit' => 11,
            'null' => false,
        ]);
        $table->addColumn('deleted', 'boolean', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->create();
    }
}

マイグレーションファイルの修正

コマンド実行でマイグレーションファイルを作成できましたが、コマンドは指定しきれない内容があるので、ファイル作成後に修正を行います。

デフォルト値を指定

デフォルト値はnullとなっているため、必要な場合は適宜修正してください。

「created」や「modified」でCURRENT_TIMESTAMPの指定をしたい場合は以下のようにします。

$table->addColumn('created', 'datetime', [
    'default' => 'CURRENT_TIMESTAMP',
    'null' => false,
]);
$table->addColumn('modified', 'datetime', [
    'default' => 'CURRENT_TIMESTAMP',
    'null' => false,
]);

MySQLのtinyint型の指定

コマンドで型を指定する際に「integer」を指定すると、以下のようにファイルが作成されます。

$table->addColumn('auth', 'integer', [
    'default' => null,
    'limit' => 11,
    'null' => true,
]);

長さが11桁となっているため、tinyintを指定したい場合は以下のようにします。

$table->addColumn('registration_flag', 'integer', [
    'default' => null,
    'limit' => MysqlAdapter::INT_TINY,
    'null' => true,
]);

MysqlAdapterというクラスがあるので、MysqlAdapterクラスの定数を使用します。
以下のようにuse文も追加してください。

use Phinx\Db\Adapter\MysqlAdapter;

外部キーを追加したい場合

外部キーを追加したい場合は以下のように指定します。

$table->addForeignKey('user_id', 'users', 'id', [
    'delete'=> 'NO_ACTION',
    'update'=> 'NO_ACTION',
    'constraint' => 'user_key',
]);

削除時のアクション(delete)、更新時のアクション(update)は、’SET_NULL’、 'NO_ACTION’、 'CASCADE’ および 'RESTRICT’が指定できます。

マイグレーションの実行

マイグレーションを実行するには、以下のコマンドを実行します。

bin/cake migrations migrate

コマンド実行後に実際にデータベースを見てみると、テーブルが作成できているのが確認できました。

migrate

「phinxlog」テーブルというのは、マイグレーションの履歴を管理するテーブルです。
中を見てみると、上記で実行したマイグレーションコマンドの内容が登録されています。

phinxlog

「users」テーブルは下記のように作成されています。

users

マイグレーションの取り消し

マイグレーションの実行を取り消ししたい場合は以下のコマンドを実行します。
直前に実行した内容が取り消されます。

bin/cake migrations rollback

取り消しを行うと、作成されたテーブルが以下のように削除されました。

rollback

「phinxlog」テーブルに関しては、テーブル自体は削除されず、先ほど登録されていたレコードが削除されます。

phinxlog_rollback

CakePHPでもマイグレーションの仕組みを利用して、テーブル作成を簡単に管理

マイグレーションを利用すると、テーブルの作成が簡単に管理できますね。
テーブルの内容をコードベースで管理し、追加や変更の履歴を追えるようにすることで非常に分かりやすいと思います。

CakePHPでのマイグレーションの方法を理解して、使ってみてください。

▼CakePHPのマイグレーションについて、詳しい内容は以下の公式ドキュメントをご覧ください。
https://book.cakephp.org/migrations/2/ja/index.html
https://book.cakephp.org/3/ja/phinx/migrations.html

▼カラムを追加する方法は以下をご覧ください。