CakePHP4 のMigrationとSeeding

スポンサーリンク

CakePHP4でのMigrationとSeedingのMEMOです。最初からつくる方法とある程度MySQLで構造やデータを作ってからそれを元につくる方法とがあります。

まず、config/app_local.php にてデータベース接続できるようにしておきます。コマンドを実行する際、この接続先に対して実行されます。ここでは後者の方法を前提にMEMOしておきます。

Migration : 既存のテーブルを元に作る場合

bin/cake bake migration_snapshot Initial

「Initial」部分は任意の名称かな。上記コマンドを実行するとconfig/Migrations に {タイムスタンプ}_Initial.php が作成されます。このマイグレーションファイルは、その時点での全てのテーブルの構造を読み取って作成してくれます。

Seeding : 既存のテーブルからデータを抽出

bin/cake bake seed --data Users

全テーブルを一括して抽出する方法はなさそうなので、テーブルごとに上記のようなコマンドを実行します。上記の例では、「users」テーブルを元にシーダーファイルを作成してます。config/Seeds に UsersSeed.php が作成されます。「_」で繋いだ「cake_samples」のようなテーブル名の場合、--data CakeSamplesとなります。

マイグレーションとシーディングの実行

MySQL内に新たなDBを作成し、config/app_local.php にてそのDBへ接続して上記に作成したMigrationとSeedを実行してみます。

bin/cake migrations migrate

config/Migrations にあるマイグレーションファイルがタイムスタンプの順に全て実行されます。実行したくないものは別のフォルダに移動しておくと良さそうです。オプションで任意のフォルダを指定することもできそうです。

bin/cake migrations seed

config/Seeds にあるシーダーを一気に実行してくれます。個別に指定したい場合は、

bin/cake migrations seed --seed UsersSeed

のように指定できます。

全部元に戻す

bin/cake migrations rollback --date 20211101

「20211101」部分は日付です。正式なやり方がありそうですが、上記のように日付指定で最初のマイグレーションファイルの日付よりも前の日付にすれば、マイグレーションを行う前の状態まで戻せました。

一個元に戻すのは

bin/cake migrations rollback

最初から作る例

もし、マイグレーションファイルを元に、最初からテーブルを作る場合はこんな感じ。

bin/cake bake migration CreateUsers name:string username:string password:string role_id:integer created modified

CreateUsers とすることで、usersテーブルが作られます。デフォルトは string で、created と modified は datetime型になるようです。

上記コマンドを実行すると、config/Migrations に {タイムスタンプ}_CreateUsers.php が作成されます。

型は

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

さらに、MySQL アダプターは、 enum 、 set 、 blob 、 json カラム型をサポートしています。 (json は MySQL 5.7 以降)

多対多の中間テーブルの形の場合

情報がないので手探りでやってみたところ、

bin/cake bake migration CreateRequestsAnswers request_id:integer answer_id:integer

とすると「requests_answers」というテーブルを作ってくれました。

Migration : 差分を元に追加のマイグレーションファイルを作成

bin/cake bake migration_diff addRoleToUser

一度マイグレーションを行った後、何かしらDBの構造に変更を行った場合、その差分を元にマイグレーションファイルを作成できます。「addRoleToUser」部分は、このマイグレーションファイルの任意の名称です。

カラムを追加

CakePHPの場合、ファイル名指定部分に従ってなんというカラムをどこに追加するのかの記述が設定されるようです。Usersテーブルに access_token というカラムを追加するMigrationファイルを作ろうとしたのですが、 to が含まれる複数単語のような場合は注意が必要です。下のファイル名の部分を AddAccessTokenToUsers のようにするとToの認識がおかしくなるので、 AddTokenToUsers のようにしてみました。

bin/cake bake migration AddTokenToUsers access_token:string

生成されたmigrationファイルは必要に応じで自力で書き換えます。型を string? にするとNULLありにできるようなのですが、なんだかエラーが出るので、? なしで作っておいて、コードを書き換えました。

$table->addColumn('access_token', 'string', [
    'default' => null,
    'limit' => 255,
    'null' => true,
]);

 

マイグレーションとシーディングについては、今後もわかったことをこのMEMOに追記していく予定です。