k01ken’s b10g

He110 W0r1d!

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

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

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

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

1.Composerでアプリを作成
2.データベースの作成
3.データベースへの接続設定を行う
4.カレントディレクトリをアプリのある位置にする
5.以下のコマンドを実行し、適当なマイグレーションファイルを作成する。マイグレーションファイルには、命令別に色々な命名規則があって、テーブル作成の場合は、Create+頭文字が大文字で複数形のテーブル名と記入しなければならない。

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

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

bin\cake migrations migrate

テーブルが作成されただけでモデルのテーブルやエンティティは作成されていない。

■テーブルにカラムを追加する
次にテーブルにカラムを追加してみるために、以下のコマンドを入力し、実行すると、マイグレーションファイルが作成される。カラムを追加するための命名規則Add+頭文字が大文字のカラム名+To+頭文字が大文字で複数形のテーブル名

bin/cake bake migration AddPriceToProducts price:decimal

そして、マイグレーションを実行する。

bin\cake migrations migrate

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

■テーブルのカラムを変更する
カラム名を変更する
カラム名を変更するための命名規則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