環境
- CakePHP 3.2.10
- migrations 1.6.2
- CakePHP3.2.10に標準で付属してきたもの
やりたいこと
DBが空の状態でダンプファイルを作り、
bin\cake migrations dump
DBを編集後
bin\cake bake migration_diff Initial
としてDBの差分から初期のインストーラーに使えそうなマイグレーションファイルを作成しようと思いました。(Inital
は適当に付けたマイグレーション名)
ただ、DBが空の状態ではダンプファイルが作成されず、
DBを編集後でもダンプファイルを作成することはできませんでした。
どうやらDBに存在しているテーブルがプラグインのテーブルなのかメインのテーブルかを判断するためにモデルから判断しているようなので、とりあえずエラーとしてテーブルが見つかりませんというエラーになっていたようです。
- Slack CakePHP #japanese の chinpei215さん、教えていただきありがとうございました!
回避方法
bin\cake migrations dump
の代わりに手動でdumpファイルを作成します。(defaultはコネクション名)
a:0:{}
これでDBが空っぽの意味になります。
DBにテーブルを作成した状態で、
bin\cake bake migration_diff Initial
とすることで空のdumpと現在のDBの差分でマイグレーションファイル
config\Migrations\タイムスタンプ_Inital.php
が作成されます。
試しにDBのテーブルをすべて削除して、
bin\cake migrations migrate
したところ、まったく同じDBが作成されたので、
初期のマイグレーションファイルを作るにはとても楽な方法じゃないでしょうか。
オチ(こっちが正解)
bin\cake migrations dump
ができないのはモデルが作られていないだけなので、DB作成後
bin\cake bake all テーブル名
でモデルも一式生成して、
bin\cake migrations dump
bin\cake bake migration_diff Initial
とすれば同じように生成されました。
(dumpとDBの内容を比べてるわけじゃないのかな?)
おしい点
ソースを調べていてなんとなく気づいてはいたのですが、
初期データとして入れたレコード等は一切考慮されないので、差分で作成したマイグレーションファイルに
public function up() {
...
$this->table('users')
->insert(
[
[
'email' => 'foo',
'password' => 'foo',
'created' => date('Y-m-d H:i:s'),
],
[
'email' => 'bar',
'password' => 'bar',
'created' => date('Y-m-d H:i:s'),
]
]
)->save();
}
という感じで追加するしかなさそう?