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に追記していく予定です。
東京造形大学卒業後、マクロメディア(現アドビ)に入社。QAやテクニカルサポートマネージャーとしてFlash、DreamweaverなどのWeb製品を担当。独立後、2007年に虫カゴデザインスタジオ株式会社を設立。2021年東京三鷹を拠点に。最近は、Unity, Unity Netcode for GameObjects, CakePHP, Laravel, ZBrush, Modo, Adobe Substance 3D, Adobe Firefly, Xcode, Apple Vision Pro, Firebaseにフォーカスしています。モバイルアプリ開発情報を主としたブログ「MUSHIKAGO APPS MEMO」の中の人。