CakePHP3でMigration Pluginを使用してテーブルを作成する

#この記事について
この記事ではCakePHPのPluginである`Migration`の初期設定方法を紹介する。

#モチベーション
複数マシンを使用し開発を行う場合、もちろんDBにあるスキーマ、テーブルも同じモノであった方がいい。以下のようなDDLをチームで共有してもさほど問題はないかもしれないが、テーブル定義が変更したりする際、わざわざ`MySQLWorkbench`などのRDMS管理ツールでSQLを叩かなくてはいけなくてめんどくさい。今回紹介する`Migration`であれば、CakePHP内のファイルを編集するだけでテーブル情報も自然に更新されるため、作業効率を高め、無駄なDB作業を減らすことができる。


```sql

CREATE TABLE topics (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
name VARCHAR(255),
description TEXT
);
```

#手順
以下を参考にしました。
CakePHP公式：https://book.cakephp.org/3.0/en/plugins.html
CakePHP3のマイグレーションでデータベースを構築する: https://www.ritolab.com/entry/60

#下準備
[前記事の下準備](https://qiita.com/norifumi92/items/a0760d55e998879ba5e4#%E4%B8%8B%E6%BA%96%E5%82%99)と同様。

#Migrationのロードの仕方
CakePHPではPluginと呼ばれるツールを用意している。このPluginを読み込むには、`src/Application.php`の'bootstrap()'メゾット内に`$this->addPlugin('Migrations');`と記述する。Defaultで既にこのコードがある場合は、記述があることを確認するだけで良い。

```php3
    public function bootstrap()
    {
        // Call parent to load bootstrap from files.
        parent::bootstrap();

        if (PHP_SAPI === 'cli') {
            $this->bootstrapCli();
        }

        /*
         * Only try to load DebugKit in development mode
         * Debug Kit should not be installed on a production system
         */
        if (Configure::read('debug')) {
            $this->addPlugin(\DebugKit\Plugin::class);
        }

        // Migrationを追加
        $this->addPlugin('Migrations');
    }
```

#MigrationsフォルダとInitialファイルの作成
cakephpルートディレクトリへ移動し、以下のコマンドを実行。

```shell-session
bin/cake bake migration_snapshot Initial
```

※実行結果のデモ
![migration_1_demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464595/d5548cd9-47f3-a81a-6c32-c24d8da9fd46.gif)

これにより、`config`フォルダ配下に`Migrations`というフォルダと、その下に`(現在時間)_Initial.php`というファイルが作成される。
自分の場合、`20190910033843_Initial.php`が作成された。

#ユーザーテーブルの作成
cakephpルートディレクトリへ移動し、'users'テーブルを作成するため、以下のコマンドを実行。

```shell-session
bin/cake bake migration CreateUsers name:string password:string role:integer[1]:indexType:indexRole last_login_at created modified
```
これにより、`Migrations`配下に`(現在時間)_CreateUsers.php`というファイルが作成される。
ちなみに、`(現在時間)_CreateUsers.php`の内容は以下のようになっている。

```php3
<?php
use Migrations\AbstractMigration;

class CreateUsers extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     * @return void
     */
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('name', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('password', 'string', [
            'default' => null,
            'limit' => 255,
            'null' => false,
        ]);
        $table->addColumn('role', 'integer', [
            'default' => null,
            'limit' => 1,
            'null' => false,
        ]);
        $table->addColumn('last_login_at', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('created', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addColumn('modified', 'datetime', [
            'default' => null,
            'null' => false,
        ]);
        $table->addIndex([
            'role',
        ], [
            'name' => 'indexRole',
            'unique' => false,
        ]);
        $table->create();
    }
}
```

#マイグレーション実行
cakephpルートディレクトリへ再度移動し、以下のコマンドを実行。

```shell-session
bin/cake migrations migrate
```

※実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464595/5fd89a78-a74f-be5e-d7f9-ae39dcb3e52b.png)
`successfully written`とあるのでマイグレーションが成功したよう。

`MySQLWorkbench`でDBに接続し、`users`テーブルが作成されていることも以下のように確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464595/7a2c6efe-723a-13c4-c829-6f0ab34227a7.png)

#最後に
この記事ではCakePHPのPluginである`Migration`について紹介しました。
つまづいたり、わからないことがあれば、気軽にコメントください。