LoginSignup
4
7

More than 3 years have passed since last update.

CakePHP3で開発、テスト用に初期データを仕込む方法

Last updated at Posted at 2019-12-10

この記事について

CakePHPでは、bin/cake migrationsというコマンドを実行するだけで、SQLを手動で実行せずにデータを挿入することができる。これにより、開発環境やテスト環境で、データを汚しても、元の状態に戻すことができる。今回はそのやり方として、Seedingと呼ばれる、名の通り「種を植える」手法を紹介する。

Seedingとは

cakephpルートディレクトリ/Seedsの配下にできる.php形式のファイルをSeedファイルと言い、それを実行するとInsertが走る。この動作をSeedingと呼ぶ。

参考

以下を参考にしました。
1. CakePHP3のSeeding(シーディング)で任意の初期データ投入&fakerでダミーデータ挿入もしてみる
2. 【CakePHP3】seedの使い方

cakephpルートディレクトリへ移動し、以下のコマンドを実行。

手順

以下の手順で初期データを仕込みます。
1. MySQLでまずデータを作る
2. MySQLのデータを元に、Seedファイルを自動生成する
3. MySQLを空にする
4. Seedingを実行し、 MySQLにデータを挿入する
5. Migrations migrateを実行し、MySQLにデータを挿入する

1. MySQLでまずデータを作る

Seedファイルを一から書き込むより、コマンドを叩いてMySQLのデータを元にシードファイルを作成した方が手取り早いので、まずはMySQLに適当なデータを作ります。

自分はこんな感じのUsers Tableを作成しました。
image.png

2. MySQLのデータを元に、Seedファイルを自動生成する

これを元に以下のコマンドを実行することで、元データのINSERT文が入ったSeedファイルが作成されます。

bin/cake bake seed --data Users

※Seedファイルを一から作りたい場合は以下を実行してください。

# seedのテンプレートファイルを生成する
bin/cake bake seed Users
# ユーザーテーブルのデータを元にseedファイルを生成する
bin/cake bake seed --data Users

これにより、Seedsフォルダ配下に、UsersSeed.phpが作成されたはずなので、確認してください。
UsersSeed.phpでは、AbstractSeedを継承し、かつrunメゾットの中で、挿入するデータをdataというArray型の変数に宣言しています。

例えば、自分の場合、以下のようなコードが書かれています。


<?php
use Migrations\AbstractSeed;

class UsersSeed extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeds is available here:
     * http://docs.phinx.org/en/latest/seeding.html
     *
     * @return void
     */
    public function run()
    {
        $data = [
            [
                'id' => '1',
                'login' => 'admin',
                'password' => 'XXX',
                'role' => 'admin',
                'name' => 'James'
            ],
            [ //以下省略

3. MySQLを空にする

テーブルのデータをTRUNCATEで空にします。

TRUNCATE TABLE users;

/*念の為、レコード数が0になっているか確認*/
SELECT count(*) FROM users;

次に、いよいよSeedingを実行します。

4. Seedingを実行し、 MySQLにデータを挿入する

生成したSeedファイルを以下で実行。

# 以下ですべてのSEEDを実行
$ bin/cake migrations seed

# UsersSeed.phpだけを実行する場合、以下を実行
$ bin/cake migrations seed --seed UsersSeed

以下、実際の実行結果のスクショです。
image.png

実行後、再度UsersテーブルをSELECTして見ると、データが戻っていることが確認できます。
image.png

5. Migrations migrateを実行し、MySQLにデータを挿入する

次に、Migrations migrateのみを実行し、Seedingを行います。
まず、Step3と同様に、TRUNCATE TABLE users;でUsersテーブルのレコードを空にします。

/config/Migrations/の配下に、新たに以下のようなMigrationファイルを作成します。

ファイル名: 20191210063412_SeedUsers.php

<?php

use Cake\Datasource\ConnectionManager;
use Migrations\AbstractMigration;
use Migrations\Migrations;

/**
 * SeedUsers Migrations
 */
class SeedUsers extends AbstractMigration
{
    public function up()
    {
        //ここで、SeedUsersという接続オブジェクトを定義
        ConnectionManager::setConfig("SeedUsers", ConnectionManager::getConfig("default"));

        //UsersSeedを以下のコードで実行
        $migration = new Migrations();
        $migration->seed(['seed' => 'UsersSeed', 'connection' => 'SeedUsers']);
    }

    public function down()
    {
        //Rollbackした際に、テーブルをTRUNCATEする
        $this->execute('TRUNCATE TABLE users');
    }
}

これで、migrations migrateを実行するだけで、データが挿入できる準備が整いました。ちなみにファイル名の頭につく20191210063412は現在の時間(Timestamp)を表しています。手動で作成する際は気をつけてください。

以下、実行結果のデモです。
Migrations_Demo.gif

Phinxlogに、実行後レコードが追加されているのが、わかります。
Rollbackする際は、Phinxlogversionコラムを確認し、戻したいVersionまで戻ることができます。
20191210063412_SeedUsers.phpで、Rollbackの際はテーブルをTRUNCATEするようdown()で定義しているので、戻すとTRUNCATEが実行され、レコードが無くなります。Rollbackは以下のコマンドで実行できます。

$bin/cake migrations rollback -t <version>

最後に

以上、CakePHPで開発、テスト用に初期データを仕込むやり方を説明しました。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7