先日CakePHP3でrename table文を発行したいニーズがあり、Migrationファイルでどう書けば良いかを調べたのでメモがてら残しておく。Phinxに定義されているメソッドを把握する必要があるため、Cakeの公式ドキュメントから具体的な解説を辿るのに少々時間がかかった。検証したCakePHPのバージョンは3.6.13、データベースはMySQL。
rename tableするにはrename()メソッドを使う
ずばりこんな感じ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php use Migrations\AbstractMigration; class RanameUsersToAdmins extends AbstractMigration { private $oldTableName = 'users'; private $newTableName = 'admins'; public function up() { $table = $this->table($this->oldTableName); $table->rename($this->newTableName); $table->update(); } public function down() { $table = $this->table($this->newTableName); $table->rename($this->oldTableName); $table->update(); } } |
これでいける。
ちなみにこの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