【CakePHP3】Migrationでrename tableする方法

masyus-work-eyecatch-cakephp3

先日CakePHP3でrename table文を発行したいニーズがあり、Migrationファイルでどう書けば良いかを調べたのでメモがてら残しておく。Phinxに定義されているメソッドを把握する必要があるため、Cakeの公式ドキュメントから具体的な解説を辿るのに少々時間がかかった。検証したCakePHPのバージョンは3.6.13、データベースはMySQL。

rename tableするにはrename()メソッドを使う

ずばりこんな感じ:

これでいける。

 

ちなみにこのrename()メソッド、Cakeのスケルトン内には定義がない。一体どこに定義されているのかというと、vendor配下のrobmorganというディレクトリ内にPHPにおけるMigration機能を提供するベンダーコード(すなわちPhinx)が配置されており、

vendor/robmorgan/phinx/src/Phinx/Db/Table.php

に定義がある。

CakeからPhinx側のメソッドへアクセスする流れは、Cakeスケルトン内の

vendor/cakephp/migrations/src/AbstractMigration.php

にてPhinx\Migration\AbstractMigrationクラスがuseされ、継承されることでアクセスできるようになるという流れ。

renameTable()ではエラーになるので注意

ただちょっと迷ったのが、実は

vendor/cakephp/migrations/src/CakeAdapter.php

にrenameTable()というメソッドが用意されていて、「なんだrenameTable()使えばいけるのかな?」って思ってたらこれがなんと動かないという。

https://github.com/cakephp/migrations/issues/235

 

つまるところ、

vendor/robmorgan/phinx/src/Phinx/Db/Table.php

にrenameTable()メソッドが無いからエラーになるらしいのだが、これってつまりCake3.6系が最新のPhinxの仕様に追随しきれてないってことなのか。。どこかの上位バージョンで解消されているといいな。

 

参考)

https://book.cakephp.org/phinx/0/en/migrations.html#renaming-a-table

https://phinx.readthedocs.io/en/latest/migrations.html

https://github.com/cakephp/migrations/issues/235