LoginSignup
8
9

More than 5 years have passed since last update.

CakePHP3で最初のマイグレーションファイルを作る

Posted at

環境

  • 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はコネクション名)

config\Migrations\schema-dump-default.lock
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();
}

という感じで追加するしかなさそう?

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9