読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

【CakePHP2.x】migartionプラグインを使ってテーブルのフィールドを変更したい

CakePHP CakePHP2.x PHP MySQL SQL

スポンサードリンク

もうCakePHP3.xがでたのにまだ2かよって話ですかね。まだ移行できない気持ちはわかるけど。

2月から新しいプロジェクトに携わっていて、「しめた・・・!」と思い、「CakePHP3.xつかいましょうよ〜^^」なんて提案しようかなとメモしていたら、新しいサーバがPHP5.4!!(CakePHP3.xはPHP5.5以上推奨です)

まぁいいけどね。

今回の話とは全く関係ない話題でした。さて、cakephp2.xにはpluginでインストールしないと使えないMigration pluginがあります。

github.com

何度か他で動いているプロジェクトで使おうと試みたけど中々うまく行きませんでした。やっぱり途中での導入は難しいのかね。

で、今回はスタートから携わることができたので、さっそくこのプラグインを使ってみました。

感想としては便利です!が、、、

alter系のマイグレーションがあんまり理解できていない。

ということでとりあえずメモした内容を晒す

環境

  • CakePHP2.8
  • MySQL5.6

やりたいこと

先に作成したusersというテーブルのフィールドbirthdayの型datetimedateへ変更したい

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するのかな?

困ったらドキュメント

github.com

フィールドを追加したり、削除したりのコマンドはあるけど型の編集はなさそう。。。まじか(´・ω・`)

えと、ググッてもでてこないね。どうしよー。

よく考えたら、削除して追加すればいいんじゃね?と思いついたのでやろうとした。

$ ./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 columnadd columnのコマンドを実行して、マイグレーションファイルを作成する。

んで、次にマイグレーションファイルを修正する。

<?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),
        )
      )
    ),
  );
...
<?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というフィールドを追加するマイグレーションファイルを作成するコマンドです。今度は変更も試す。