本記事では、CakePHPのプラグインに用意されている migration を利用する方法を記載いています。
CakePHPでアクセスするデータベースの構築、変更は、SQLを直接発行することでも可能です。
SQLを直接発行して、データベースを構築したり、変更できるので、
SQLに慣れている場合には、直接メンテナスをする場合もあるかと思います。
しかしながら、migration を利用することで、
データベースの変更管理などがしやすくなり、メリットが多いと思います。
簡単なmigration ファイルの記載していますので、参考にしてみてください。
migrationファイルの作成
最初に、Usersと、Commentsテーブルを作成してみます。
Users、Commentsテーブルの作成
1 2 3 4 5 |
[hoge@test app]$ bin/cake bake migration ceateUsers Creating file /home/hoge.com/app/Migrations/20210614051937_CeateUsers.php Wrote ` /home/hoge.com/app/config/Migrations/20210614051937_CeateUsers.php` [hoge@test app]$ |
上記のコマンドを実行すると、Users用のマイグレーションファイルが生成されます。
このファイルを編集していきます。
ちなみに、マイグレーションファイル名は、下記のようなルールで生成されます。
1 |
config/Migrations/YYYYMMDDHHMMSS_CeateUsers.php |
Usersテーブルは、一般的な項目を定義していきます。
・name
・kana
・gender
・birthday
・email
・password
Commentsテーブルは、一般的な項目を定義していきます。
・comments
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
declare(strict_types=1); use Migrations\AbstractMigration; class CeateUsers extends AbstractMigration { /** * Change Method. * * More information on this method is available here: * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method * @return void */ public function change() { //users $table = $this->table('users'); $table->addColumn('name', 'string', [ 'limit' => 128, 'null' => false, ]) ->addColumn('kana', 'string', [ 'limit' => 128, 'null' => false, ]) ->addColumn('gender', 'integer', [ 'limit' => 2, 'null' => true, ]) ->addColumn('birthday', 'date', [ 'default' => null, 'null' => true, ]) ->addColumn('email', 'string', [ 'limit' => 256, 'null' => false, ]) ->addColumn('password', 'string', [ 'limit' => 256, 'null' => false, ]) ->addColumn('created', 'datetime') ->addColumn('modified', 'datetime') ->create(); // comments $table = $this->table('comments'); $table->addColumn('user_id', 'integer', [ 'null' => false ]) ->addColumn('comment_parent_id', 'integer', [ 'default' => null, 'null' => true ]) ->addColumn('content', 'string', [ 'limit' => 256, 'null' => false ]) ->addColumn('created', 'datetime') ->addColumn('modified', 'datetime') ->create(); } } |
マイグレーションファイルを編集後に、マイグレーションを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[hoge@test app]$ bin/cake migrations migrate using migration paths - /home/hoge.com/app/config/Migrations using seed paths - /home/hoge.com/app/config/Seeds using environment default using adapter mysql using database db_test ordering by creation time == 20210614051937 CeateUsers: migrating == 20210614051937 CeateUsers: migrated 0.1897s All Done. Took 0.1927s Dumps the current schema of the database to be used while baking a diff using migration paths - /home/hoge.com/app/config/Migrations using seed paths - /home/hoge.com/app/config/Seeds Writing dump file `/home/hoge.com/app/config/Migrations/schema-dump-default.lock`... Dump file `/home/hoge.com/app/config/Migrations/schema-dump-default.lock` was successfully written [hode@test app]$ |
上記のようなメッセージが表示されていれば、
Users、Commentsテーブルは作成されています。
テーブルの作成以外にも、更新、削除なども、
定義して、実行することができます。
せっかくなので、作成したテーブルに、テスト用のデータも登録していきます。
初期データの登録
初期データの登録は、シードファイルを作って初期データを登録します。
Usersテーブル
シードファイルは、下記のコマンドで生成することができます。
1 2 3 4 5 |
[hoge@test app]$ bin/cake bake seed --data Users Creating file /home/hoge.com/app/config/Seeds/UsersSeed.php Wrote `/home/hoge.com/app/config/Seeds/UsersSeed.php` [hoge@test app]$ |
上記のコマンドで生成されたシードファイルを次のように編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
declare(strict_types=1); use Migrations\AbstractSeed; /** * Users seed. */ class UsersSeed extends AbstractSeed { /** * Run Method. * * Write your database seeder using this method. * * More information on writing seeds is available here: * https://book.cakephp.org/phinx/0/en/seeding.html * * @return void */ public function run() { $data = [ [ 'name' => 'user_name_1', 'kana' => 'user_kana_1', 'gender' => NULL, 'birthday' => NULL, 'email' => 'user1@test.com', 'password' => '1234567890', 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ],[ 'name' => 'user_name_2', 'kana' => 'user_kana_2', 'gender' => NULL, 'birthday' => NULL, 'email' => 'user2@test.com', 'password' => '1234567890', 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ],[ 'name' => 'user_name_3', 'kana' => 'user_kana_3', 'gender' => NULL, 'birthday' => NULL, 'email' => 'user3@test.com', 'password' => '1234567890', 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ] ]; $table = $this->table('users'); $table->insert($data)->save(); } } |
下記のコマンドを実行して、Usersテーブルの初期データの登録を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[hoge@test app]$ bin/cake migrations seed --seed UsersSeed using migration paths - /home/hoge.com/app/config/Migrations using seed paths - /home/hoge.com/app/config/Seeds using migration paths - /home/hoge.com/app/config/Migrations using seed paths - /home/hoge.com/app/config/Seeds using environment default using adapter mysql using database db_test == UsersSeed: seeding == UsersSeed: seeded 0.0276s All Done. Took 0.0283s [hoge@test app]$ |
Commnetsテーブル
1 2 3 4 5 |
[hoge@test app]$ bin/cake bake seed --data Comments Creating file /home/hoge.com/app/config/Seeds/CommentsSeed.php Wrote `/home/hoge.com/app/config/Seeds/CommentsSeed.php` [hoge@test app]$ |
コメントテーブル用のファイルも編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
declare(strict_types=1); use Migrations\AbstractSeed; /** * Comments seed. */ class CommentsSeed extends AbstractSeed { /** * Run Method. * * Write your database seeder using this method. * * More information on writing seeds is available here: * https://book.cakephp.org/phinx/0/en/seeding.html * * @return void */ public function run() { $data = [ [ 'user_id' => 1, 'content' => 'content1_1', 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ],[ 'user_id' => 1, 'content' => 'content1_2', 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ],[ 'user_id' => 1, 'content' => 'content1_3', 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ],[ 'user_id' => 1, 'content' => 'content1_2_1', 'comment_parent_id' => 2, 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ],[ 'user_id' => 2, 'content' => 'content2_1', 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ],[ 'user_id' => 2, 'content' => 'content2_2', 'created' => '2021-06-14 10:00:00', 'modified' => '2021-06-14 10:00:00', ] ]; $table = $this->table('comments'); $table->insert($data)->save(); } } |
下記のコマンドを実行して、Commentsテーブルの初期データの登録を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[hoge@test app]$ bin/cake migrations seed --seed CommentsSeed using migration paths - /home/hoge.com/app/config/Migrations using seed paths - /home/hoge.com/app/config/Seeds using migration paths - /home/hoge.com/app/config/Migrations using seed paths - /home/hoge.com/app/config/Seeds using environment default using adapter mysql using database db_test == CommentsSeed: seeding == CommentsSeed: seeded 0.0140s All Done. Took 0.0151s [hoge@test app]$ |
まとめ
簡単でしたが、CakePHPのmigrationの利用方法を解説いたしました。
migrationは簡単に利用することができます。
しかしながら、初期データなどの記述など、手間のかかる部分もあります。
最初に、手間はかかりますが、テスト時などにも再利用が可能です。
ぜひ、機会があれば、利用してみてはいかがでしょうか?