1. Home
  2. PHP
  3. CakePHP
  4. CakePHP3のSeeding(シーディング)で任意の初期データ投入&fakerでダミーデータ挿入もしてみる

CakePHP3のSeeding(シーディング)で任意の初期データ投入&fakerでダミーデータ挿入もしてみる

  • 公開日
  • 更新日
  • カテゴリ:CakePHP
  • タグ:PHP,migration,Seeding,Faker,Beginner,CakePHP
CakePHP3のSeeding(シーディング)で任意の初期データ投入&fakerでダミーデータ挿入もしてみる

マイグレーションによって何度でもデータベースを再構築できるのは良いですが、その都度初期データを挿入しなければならず、どうせなら一緒に投入してしまいたいと思う時があります。

そんな時でも、PHP フレームワークには Seeding(シーディング)と呼ばれる機能があり、マイグレーション実行時に初期データを一緒に投入することが可能です。

ということで今回は、CakePHP3 の Seeding(シーディング)で初期データを投入します。

また、faker というライブラリを使ってダミーデータを自動生成し、投入するまでも後半で行います。

[公式]seed : データベースの初期データ投入https://book.cakephp.org/3.0/ja/migrations.html#seed[Phinx]Database Seedinghttp://docs.phinx.org/en/latest/seeding.html## Contents

開発環境

  • linux CentOS 7
  • Apache 2.4
  • PHP 7.1
  • MySQL 5.7
  • CakePHP 3.5

CakePHP のルートディレクトリを「cakephp/」とします。

尚、今回は、ユーザ情報を格納する Users テーブルに初期データを投入していきます。テーブルは作成済み前提で進めますので、まだの場合は

を参考にマイグレーションで作成してください。

シードファイルの生成

まずは、初期データを投入するための Seeder 構築のために、シードファイルを生成します。

cakephp ルートディレクトリへ移動し、以下の bake コマンドを叩きます。

# CakePHP のルートディレクトリへ移動する
cd /path/to/cakephp

# seed ファイルを生成する
bin/cake bake seed Users

# 実行結果
[demo@localhost cakephp]# bin/cake bake seed Users

Creating file /var/www/html/cakephp/config/Seeds/UsersSeed.php
Wrote `/var/www/html/cakephp/config/Seeds/UsersSeed.php`

cakephp/config/Seeds 配下に UsersSeed.php が生成されます。

cakephp
├─ config
|   └─ Seeds
|       └─ UsersSeed.php
cakephp/config/Seeds/UsersSeed.php
<?php
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:
     * http://docs.phinx.org/en/latest/seeding.html
     *
     * @return void
     */
    public function run()
    {
        $data = [];

        $table = $this->table('users');
        $table->insert($data)->save();
    }
}

ここに、実際に挿入するデータを記述していきます。最終的には、以下のようになります。

<?php
use Migrations\AbstractSeed;
use Cake\Auth\DefaultPasswordHasher;

/**
 * Users seed.
 */
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()
  {
    $datetime = date('Y-m-d H:i:s');
    $data = [
      [
        'name' => 'test01',
        'email' => 'test01@test.com',
        'password' => $this->_setPassword(123456),
        'role' => '1',
        'last_login_at' => $datetime,
        'created' => $datetime,
        'modified' => $datetime,
      ],
      [
        'name' => 'test02',
        'email' => 'test02@test.com',
        'password' => $this->_setPassword(123456),
        'role' => '2',
        'last_login_at' => $datetime,
        'created' => $datetime,
        'modified' => $datetime,
      ],
      [
        'name' => 'test03',
        'email' => 'test03@test.com',
        'password' => $this->_setPassword(123456),
        'role' => '3',
        'last_login_at' => $datetime,
        'created' => $datetime,
        'modified' => $datetime,
      ],

    ];

    $table = $this->table('users');
    $table->insert($data)->save();
  }

  /**
   * ハッシュ化されたパスワードを返却する
   * @param $value
   * @return bool|string
   */
  protected function _setPassword($value)
  {
    $hasher = new DefaultPasswordHasher();
    return $hasher->hash($value);
  }
}

run() メソッドに、投入するデータを配列で追記していく事で、初期投入データを定義できます。

シードを実行し初期データを投入する

それでは実際にシードを実行し、初期データを投入してみます。

cakephp ルートディレクトリへ移動し、以下のコマンドを叩きます。

# CakePHP のルートディレクトリへ移動する
cd /path/to/cakephp

# seed を実行し初期データを投入する
bin/cake migrations seed

# 実行結果
[demo@localhost cakephp]# bin/cake migrations seed
using migration paths 
 - /var/www/html/cakephp/config/Migrations
using seed paths 
 - /var/www/html/cakephp/config/Seeds
using migration paths 
 - /var/www/html/cakephp/config/Migrations
using seed paths 
 - /var/www/html/cakephp/config/Seeds
using environment default
using adapter mysql
using database cakephp

 == UsersSeed: seeding
 == UsersSeed: seeded 0.3015s

All Done. Took 0.3026s

MySQL へログインし、データが追加されているか確認します。

mysql> select * from users;
*************************** 1. row ***************************
id: 1
         name: test01
email: test01@test.com
password: $2y$10$EnvdDtGVYLByFGZAaE9suibE9.iqniW8v7HaJjqg
role: 1
last_login_at: 2018-01-21 13:50:18
created: 2018-01-21 13:50:18
modified: 2018-01-21 13:50:18
*************************** 2. row ***************************
id: 2
         name: test02
email: test02@test.com
password: $2y$10$MHiyhTdRkZiNcPG70U7L.afnLI43O16hSe1QDc6s
role: 2
last_login_at: 2018-01-21 13:50:18
created: 2018-01-21 13:50:18
modified: 2018-01-21 13:50:18
*************************** 3. row ***************************
id: 3
         name: test03
email: test03@test.com
password: $2y$10$oZqWYNZ3nbJsLIDaajf4OeL8x2oMITaahlDOsupa
role: 3
last_login_at: 2018-01-21 13:50:18
created: 2018-01-21 13:50:18
modified: 2018-01-21 13:50:18

問題なく3件の初期データが投入されていることを確認できました。

faker でダミーデータを生成し投入する

初期データ投入を行えるようになったところで、Faker というダミーデータを生成するライブラリを使ってテスト用のダミーデータを生成し、シーダーにて投入してみます。

faker のインストール

faker は composer にてインストールします。 cakephp ルートディレクトリへ移動し、以下のコマンドを叩きます。

# CakePHP のルートディレクトリへ移動する
cd /path/to/cakephp

# faker ライブラリをインストールする
composer require fzaninotto/faker

# 実行結果
[demo@localhost cakephp]# composer require fzaninotto/faker
Using version ^1.7 for fzaninotto/faker
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing fzaninotto/faker (v1.7.1): Loading from cache
Writing lock file
Generating autoload files
> Cake\Composer\Installer\PluginInstaller::postAutoloadDump

インストールが完了したら、cakephp/composer.json を確認します。

"require": {
    "php": ">=5.6",
    "cakephp/cakephp": "3.5.*",
    "cakephp/migrations": "^1.0",
    "cakephp/plugin-installer": "^1.0",
    "fzaninotto/faker": "^1.7",
    "josegonzalez/dotenv": "2.*",
    "mobiledetect/mobiledetectlib": "2.*"
},

fzaninotto/faker の導入が確認できました。

ダミーデータを生成する

それでは faker を使ってダミーデータを生成します。

先ほど作成した Seed ファイルを以下に書き換えます。

<?php
use Migrations\AbstractSeed;
use Cake\Auth\DefaultPasswordHasher;

/**
 * Users seed.
 */
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()
  {
    $datetime = date('Y-m-d H:i:s');

    // fakerインスタンスを生成する
    $faker = Faker\Factory::create('ja_JP');

    // 100件のダミーデータを生成する
    for ($i = 0; $i < 100; $i++) {
      $data[] = [
        'name' => $faker->name,
        'email' => $faker->email,
        'password' => $this->_setPassword(123456),
        'role' => $faker->numberBetween($min = 2, $max = 4),
        'last_login_at' => $datetime,
        'created' => $datetime,
        'modified' => $datetime,
      ];
    }

    $table = $this->table('users');
    $table->insert($data)->save();
  }

  /**
   * ハッシュ化されたパスワードを返却する
   * @param $value
   * @return bool|string
   */
  protected function _setPassword($value)
  {
    $hasher = new DefaultPasswordHasher();
    return $hasher->hash($value);
  }
}

対象がユーザ情報なので全てダミーデータにはできませんでしたが、faker を用いて「名前」「メールアドレス」「ロール値」のダミーを生成しています。

どんなデータが生成できるのかについては、公式の Github を参照すると網羅されているので参考にしてみてください。

[Github]fzaninotto/Fakerhttps://github.com/fzaninotto/Faker/blob/master/readme.md### Seed 実行

それではシードを実行し、ダミーデータを挿入してみます。 cakephp ルートディレクトリへ移動し、以下のコマンドを叩きます。

# CakePHP のルートディレクトリへ移動する
cd /path/to/cakephp

# Seed を実行し、ダミーデータを挿入する
bin/cake migrations seed

# 実行結果
[demo@localhost cakephp]# bin/cake migrations seed
using migration paths 
 - /var/www/html/cakephp/config/Migrations
using seed paths 
 - /var/www/html/cakephp/config/Seeds
using migration paths 
 - /var/www/html/cakephp/config/Migrations
using seed paths 
 - /var/www/html/cakephp/config/Seeds
using environment default
using adapter mysql
using database cakephp

 == UsersSeed: seeding
 == UsersSeed: seeded 6.6649s

All Done. Took 6.6660s

MySQL へログインし、データが追加されているか確認します。

mysql> select * from users;
*************************** 97. row ***************************
id: 97
         name: 三宅 智也
email: youichi83@mail.goo.ne.jp
password: $2y$1$sj9lf1FYBr9AQhX.NAgY.YJb9MKQR.m7a1kIV1LBjWi
role: 2
last_login_at: 2018-01-21 16:06:55
created: 2018-01-21 16:06:55
modified: 2018-01-21 16:06:55
*************************** 98. row ***************************
id: 98
         name: 加藤 香織
email: harada.nanami@yahoo.co.jp
password: $2y$1$sj9lf1FYBr9AQhX.NAgY.YJb9MKQR.m7a1kIV1LBjWi
role: 2
last_login_at: 2018-01-21 16:06:55
created: 2018-01-21 16:06:55
modified: 2018-01-21 16:06:55
*************************** 99. row ***************************
id: 99
         name: 小泉 太郎
email: bkudo@yahoo.co.jp
password: $2y$1$sj9lf1FYBr9AQhX.NAgY.YJb9MKQR.m7a1kIV1LBjWi
role: 3
last_login_at: 2018-01-21 16:06:55
created: 2018-01-21 16:06:55
modified: 2018-01-21 16:06:55
*************************** 100. row ***************************
id: 100
         name: 大垣 智也
email: sasaki.sayuri@matsumoto.net
password: $2y$1$sj9lf1FYBr9AQhX.NAgY.YJb9MKQR.m7a1kIV1LBjWi
role: 4
last_login_at: 2018-01-21 16:06:55
created: 2018-01-21 16:06:55
modified: 2018-01-21 16:06:55

正常に 100 件のダミーデータが生成され挿入されている事を確認できました。

まとめ

Seeding を用いての初期データ投入作業は以上です。

任意のデータを挿入し必要最低限のデータを用意するも良し、faker を使って大量のデータを用意するも良し、開発を行う前にサンプルデータでいちいち悩まされなくて良いですね。

また、シーディングを実装しておけば、開発者全員が同じデータを使うこともできるので、時間短縮にもなります。

マイグレーションと併せて利用するととても開発がはかどるので是非試してみてください。

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級