もうCakePHP3.xがでたのにまだ2かよって話ですかね。まだ移行できない気持ちはわかるけど。
2月から新しいプロジェクトに携わっていて、「しめた・・・!」と思い、「CakePHP3.xつかいましょうよ〜^^」なんて提案しようかなとメモしていたら、新しいサーバがPHP5.4!!(CakePHP3.xはPHP5.5以上推奨です)
まぁいいけどね。
今回の話とは全く関係ない話題でした。さて、cakephp2.xにはpluginでインストールしないと使えないMigration pluginがあります。
何度か他で動いているプロジェクトで使おうと試みたけど中々うまく行きませんでした。やっぱり途中での導入は難しいのかね。
で、今回はスタートから携わることができたので、さっそくこのプラグインを使ってみました。
感想としては便利です!が、、、
alter
系のマイグレーションがあんまり理解できていない。
ということでとりあえずメモした内容を晒す
環境
- CakePHP2.8
- MySQL5.6
やりたいこと
先に作成したusers
というテーブルのフィールドbirthday
の型datetime
をdate
へ変更したい
mysql> desc users; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | email | varchar(255) | NO | | NULL | | | password | varchar(255) | NO | | NULL | | | birthday | datetime | NO | | NULL | | | created | datetime | NO | | NULL | | | modified | datetime | NO | | NULL | | +----------+--------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
mysqlでやったらすぐですよね。
mysql> alter table users modify birthday date;
やってみる
あれ・・・? そもそもどうやってalter
するのかな?
困ったらドキュメント
フィールドを追加したり、削除したりのコマンドはあるけど型の編集はなさそう。。。まじか(´・ω・`)
えと、ググッてもでてこないね。どうしよー。
よく考えたら、削除して追加すればいいんじゃね?と思いついたのでやろうとした。
$ ./Console/cake Migrations.migration generate remove_birthday_from_users
上にあるコマンドを実行したら、マイグレーションファイルは作成されました。しかし、、、
$ ./Console/cake Migrations.migration run all
適応してもなんも起きない? なぜ?
マイグレーションファイルを確認したところ
<?php ... public $migration = array( 'up' => array( 'drop_field' => array( ), ), 'down' => array( ), ); ...
あれ? 何も書いてないじゃん。
多分コマンドが間違えているんだと思うんだけど、コマンドから生成したマイグレーションファイルには何も書かれることはなかった。。。理由はわからん。
なので、どうするかといえば手動で追加(コマンドで生成されたソースを修正する)することにした。
まず、remove column
とadd column
のコマンドを実行して、マイグレーションファイルを作成する。
んで、次にマイグレーションファイルを修正する。
- delete用のマイグレーションファイル
<?php ... public $migration = array( 'up' => array( 'drop_field' => array( 'users' => array('birthday'), ), ), // downも追加してあげないと戻すことができない 'down' => array( 'add_field' => array( 'users' => array( 'birthday' => array('type' => 'datetime', 'null' => false, 'default' => null), ) ) ), ); ...
- add用のマイグレーションファイル
<?php ... public $migration = array( 'up' => array( 'create_field' => array( 'users' => array( 'birthday' => array('type' => 'date', 'null' => false, 'default' => null, 'after' => 'password'), ), ), ), 'down' => array( 'drop_field' => array( 'users' => array('birthday'), ), ), ); ...
これでおk。
近頃は謎が深まるばかりでこまるなー(´・ω・)
追記 2016/03/04
まだ変更は試していないけど、追加はできた。
$ ./Console/cake Migrations.migration generate add_item_sizes_id_to_items items_sizes_id:integer
items
ってテーブルに、add_item_sizes_id
というフィールドを追加するマイグレーションファイルを作成するコマンドです。今度は変更も試す。