RitoLabo

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

  • 公開:
  • 更新:
  • カテゴリ: PHP CakePHP
  • タグ: PHP,migration,Seeding,Faker,Beginner,CakePHP,3.5

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

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

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

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

[公式]seed : データベースの初期データ投入
https://book.cakephp.org/3.0/ja/migrations.html#seed
[Phinx]Database Seeding
http://docs.phinx.org/en/latest/seeding.html
アジェンダ
  1. 開発環境
  2. シードファイルの生成
  3. シードを実行し初期データを投入する
  4. fakerでダミーデータを生成し投入する
    1. fakerのインストール
    2. ダミーデータを生成する
    3. Seed実行

開発環境

  • 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/Faker
https://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を使って大量のデータを用意するも良し、開発を行う前にサンプルデータでいちいち悩まされなくて良いですね。

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

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