k01ken’s b10g

He110 W0r1d!

CakePHP3でマイグレーションを行う

開発環境は、Windows 7 Professional(32bit)+XAMPP v3.22+CakePHP 3.6.4。

マイグレーションとは、コマンド経由で、テーブルを作成、追加、修正、削除などのテーブル操作をしつつ、そのバージョン管理(変更履歴を管理)ができるツールのことです。

Phinxというデータベースマイグレーションライブラリをラッパーすることによって、このコマンドを実現しています。

1.Composerでアプリを作成
2.データベースの作成
3.データベースへの接続設定を行う
4.カレントディレクトリをアプリのある位置にする
5.以下のコマンドを実行し、適当なマイグレーションファイルを作成する。マイグレーションファイル名は判別しやすいように今回やりたいことにふさわしい名前をつける。

bin\cake bake migration CreateProducts name:string description:text created

6.作成したマイグレーションスクリプトを開いて定義する。
7.マイグレーションを実行する。実行するとデータベースにphinxlogテーブル(これはマイグレーションの実行結果について記録しているテーブル)とproductsテーブルが作成されている。

bin\cake migrations migrate

8.テーブルが作成されただけでモデルのテーブルやエンティティは作成、修正されていないので、ここで定義しておくこと。

■テーブルにカラムを追加する

例えば、alertsテーブルに、boolean型のcheckpoint(default値はfalse、statusカラムの後に入れる)というカラムを作成したいならば、

<?php
    public function change()
    {
      $table = $this->table('alerts');
      $table->addColumn('checkpoint', 'boolean',['default' => false, 'after' => 'status'])->update();
    }
?>

という風に書き、マイグレーションを実行する。

bin\cake migrations migrate

checkpointカラムが作成されている。

■テーブルのカラムを変更する
カラム名を変更する
カラム名を変更するための命名規則Rename+頭文字が大文字の変更したいカラム名+To+頭文字が大文字で複数形のテーブル名

bin\cake bake migration RenamePriceToProducts

マイグレーションファイルが作成された後、作成されたマイグレーションファイルのchange()メソッド内に以下のコードを書く。

<?php
    public function change(){
	$table = $this->table("products");
	$table->renameColumn("price","age");
    }

?>
bin\cake migrations migrate

カラム名のpriceがageに変更されている。

カラム名の型を変更する
カラム名の型を変更するための命名規則Change+頭文字が大文字の変更したいカラム名+To+頭文字が大文字で複数形のテーブル名

bin\cake bake migration ChangeAgeToProducts

マイグレーションファイルが作成された後、作成されたマイグレーションファイルのchange()メソッド内に以下のコードを書く。

<?php
    public function change(){
	$table = $this->table("products");
	$table->changeColumn("age","integer");
    }

?>
bin\cake migrations migrate

カラム名の型がdecimalからintに変更されている。


☆あるカラムのNOT NULL制約を解除する
例えば、postsテーブルのtitleカラムについているNOT NULL制約を解除したい場合は、change()関数内に、以下のようなコードを入れます。

<?php

  $table = $this->table('posts');
  $table->changeColumn('title', 'text', ['null' => false])->save();

?>

マイグレーションを実行した後に、カラムの存在するテーブルのModelのTableのファイル(今回の場合は、/src/Model/Table/PostsTable.php)を開いて、validationDefault関数内の、titleカラムのバリデーションの

<?php
->requirePresence('title', 'create')
?>

の部分を削除し、

<?php
->allowEmptyString('title', false);
?>

<?php
->allowEmptyString('title');
?>

にする。


参考リンク
CakePHP3のマイグレーションまとめ - Qiita
https://book.cakephp.org/3.0/ja/migrations.html
CakePHP3のMigration(マイグレーション)でカラム追加・変更・削除を行う
CakePHP3(Phinx)のMigration記述例 - Qiita