『PHPの現場』というポッドキャストの放送で、ひときわ印象に残ったこの言葉。
そう言われると確かに、例えばゲームなら、
- アイテムの名前
- アイテムの数
- HPにMP
- 敵の名前
- 敵の種類
- 画像/動画データ など、
ありとあらゆるデータが『データベース』に保存されていてやりとりされています。
データベース・・たくさんのデータが保存できるソフト。MySQLなど。
仕事で使うような在庫管理、勤怠管理、予約管理なんかのシステムももれなく『データベース』にデータが保存されています。
何かしらのプログラミング言語を使って、
『データベース』の中のデータを表示させたり、計算したり、時には消したりしています。
と思ったりしたわけです。
効率的にプログラミングするために考え出された『MVC(エムブイシー)モデル』でも、
『データベース』とのやりとりが重要視されています。
M・・モデル データベースとのやりとり
V・・ビュー 見た目
C・・コントローラー データの処理
一生懸命何かしらのソフトを作ったとしても、
仮にデータの計算が間違ってたり、金額計算が間違ってたりするとえらいこっちゃです。
ゲームでも最初からレベル99になったら興ざめしちゃうし、
はぐれメタル倒しても経験値1ならなんでやねんってなっちゃうし、
ATMに1万円入金したはずが 2000円とかになっちゃったらえらいこっちゃです。
なので、
という確認の意味を込めて、
『ダミーデータ(テストデータ)』を登録しつつテストしてみるという手順が必要になります。
とはいえ『ダミーデータ(テストデータ)』を1つずつ手で入力していくと、
10件くらいなら頑張れるかもしれないけれど、
100件、1000件と数が増えるにつれ苦行にしかならないし、
なんてことになって、『テストデータ』をまたイチから手打ちで登録なんてやってると日が暮れちゃうし。
ということで、先人達が知恵を絞って、
と、『ダミーデータ(テストデータ)』をさくっとつくれる仕組みをつくってくれました。
PHPのフレームワーク『Laravel(ララベル)』でも、
『ダミーデータ(テストデータ)』をさくっと作れる仕組みが含まれています。
正直なところ、『Laravel(ララベル)』を覚えた当初は、
と思っていたんですが、
実際にWebアプリをつくっていくうちに、
- データベースの構成が変わって作り直し
- その度にダミーデータを手打ちし直し
という事をやっていて、かなりムダな時間がかかっていたので、
ある程度『Laravel(ララベル)』に慣れて、webアプリをつくろうという段階になったら、
ぜひダミーデータ作りに挑戦してもらえたらと思います。
Laravel 5.5 で試しています。
Laravelでダミー(テスト)データを作る仕組み
『Laravel(ララベル)』で『ダミーデータ(テストデータ)』を作成する場合、
大きく3つのツールを使うことになります。
- seeder(シーダー)・・ダミーデータを登録できる
- faker(フェイカー)・・ダミーデータを生成できる
- factory(ファクトリー)・・ダミーデータの量産装置
イメージはこんな感じでしょうか。(雑ですみません)
画面右のモデルに対して、
『ダミーデータ(テストデータ)』を投入していきます。
『ダミーデータ(テストデータ)』を作る方法は大きく2つあると思っていて、
1.seeder(シーダー)に直接書く・・少しのデータならこれでOK
か、
2. faker(フェイカー)とfactory(ファクトリー)を使う・・大量のデータをつくるならこっち
になります。
まずは画面右の『モデル』をつくってみます。
Laravelで『ダミー(テスト)データ』を作るその前に まずはモデルつくりから
まずは『Laravel(ララベル)』のインストールから。
composer create-project --prefer-dist laravel/laravel blog "5.5.*"
のコマンドで『Laravel(ララベル)』をインストールします。
『Laravel(ララベル)』インストールの参考記事
無事インストールできたらおもむろに『モデル』をつくります。
今回は『Dept(部署)』というモデルと、『Employee(従業員)』というモデルをつくる想定にしてます。
営業や総務という部署があって、その中に働く人が何人かいる、という想定になります。
下記のコマンドで『モデル』が生成されます。
php artisan make:model Dept -m
生成された『Dept』モデルをちょっといじって、
//Laravel/app/Dept.php <?php namespace App; use IlluminateDatabaseEloquentModel; class Dept extends Model { protected $fillable = [ 'dept_id', 'dept_name', ]; //hasMany設定 public function employees() { return $this->hasMany('AppEmployee','dept_id','dept_id'); } }
『Employee』モデルもつくって、
php artisan make:model Employee -m
『Employee』モデルもちょっといじって、2つの『モデル』を紐づけています。
(紐づけ関連はおいおい記事にする予定です。)
//Laravel/app/Employee.php <?php namespace App; use IlluminateDatabaseEloquentModel; class Employee extends Model { protected $fillable = [ 'dept_id', 'name', ]; //belongsTo設定 public function depts() { return $this->belongsTo('AppDept','dept_id','dept_id'); } }
『モデル』を作る時に、 -m というオプションをつけていたので、
『マイグレーションファイル』も同時生成されます。
マイグレーションファイル・・データベースの中のテーブルの雛形。
こちらもちらっと追記して、
//Laravel/database/migrations/create_depts_table.php <?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration; class CreateDeptsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('depts', function (Blueprint $table) { $table->increments('id'); $table->integer('dept_id'); $table->string('dept_name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('depts'); } }
employee側のマイグレーションファイルもちらっと追記して。
//Laravel/database/migrations/create_employees_table.php <?php use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration; class CreateEmployeesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('employees', function (Blueprint $table) { $table->increments('id'); $table->integer('dept_id'); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('employees'); } }
ここまでで2つの『モデル』が作成できました。
今のところ、データベースの中に『Dept』と『Employee』2つの箱はつくったけど、
中身のデータが全然入ってない状態です。
ここに『ダミーデータ(テストデータ)』や初期データをいれるようにしてみます。
Laravelでダミー(テスト)データを作る手順その1 シーダーに直で書いて設定
さっそくダミーデータを書いていきます。
まずは『Dept(部署)』の方から。
おもむろにこんなコマンドをうつと、
php artisan make:seed DeptsTableSeeder
『DeptsTableSeeder.php』というファイルが生成されるので、ガリガリと書いていきます。
『Dept(部署)』の方は、部署の種類が今回はそこまで多くないので手入力でいいかなと思ったりします。
//Laravel/database/seeds/DeptsTableSeeder.php <?php use IlluminateDatabaseSeeder; class DeptsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // $this->call(UsersTableSeeder::class); DB::table('depts')->insert([ ['id' => '1', 'dept_id' => '1', 'dept_name' => '営業', 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ], [ 'id' => '2', 'dept_id' => '2', 'dept_name' => '総務', 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ], [ 'id' => '3', 'dept_id' => '3', 'dept_name' => 'システム', 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ], [ 'id' => '4', 'dept_id' => '4', 'dept_name' => '人事', 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ], [ 'id' => '5', 'dept_id' => '5', 'dept_name' => '幹部', 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ], ]); } }
こんな感じですね。
『Seeder(シーダー)』は各モデルごとに生成する必要があって、それらを取りまとめる『DatabaseSeeder.php』というファイルに紐付けます。
//Laravel/database/seeds/DatabaseSeeder.php <?php use IlluminateDatabaseSeeder; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // $this->call(UsersTableSeeder::class); $this->call(DeptsTableSeeder::class); } }
この状態で下記コマンドをうつと、
php artisan db:seed
『データベース』の『Dept(部署)』の中に入力した部署が登録されます。
こんな感じになります。
また、下記のコマンドをうつと、
php artisan migrate:refresh –seed
データベースの中のテーブル構成をまるっと初期化しつつ、『Seeder(シーダー)』に書いたデータをまるっと再登録してくれます。
Laravelでダミー(テスト)データを作る手順その2 fakerとfactoryでダミーデータを大量生成
『Dept(部署)』側ができたので、続いて『Employee(従業員)』のダミーデータ。
人数が少なければ手打ちでもいいんですが、
せっかくなので 大量の人数を登録してみることにします。
下記コマンドで『factory』をつくります。
php artisan make:factory EmployeeFactory
すると、
laravel/database/factories/EmployeeFactory.php
という『factory(ファクトリー)』ファイルが生成されます。
『factory(ファクトリー)』ファイルの中で、『faker(フェイカー)』を使って『ダミーデータ』をつくります。
『faker(フェイカー)』には、
- ダミー名前
- ダミーメールアドレス
- ダミーの数値
- ダミーの郵便番号
- ダミーの日付
などたくさんのオプションがあるので詳細はマニュアルを参照いただくことにしつつ、
今回はこんな内容にしました。
<?php use FakerGenerator as Faker; //ここでfakerを読み込み $factory->define(AppEmployee::class, function (Faker $faker) { return [ // 'name' => $faker->name, 'dept_id' => $faker->numberBetween($min = 1, $max = 5), 'created_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()), ]; });
なんとなくわかるかもですが、
$faker->nameでダミーの名前をつくって、
$faker->numberBetween($min = 1, $max = 5) で1から5までランダムに登録して、
$faker->datetime($max = ‘now’, $timezone = date_default_timezone_get()) で最大値を現在時刻にしてます(ここは適当です)。
『factory(ファクトリー)』と『faker(フェイカー)』を設定した後で、
『Seeder(シーダー)』側で、実際にダミーデータを登録します。
このコマンドで『EmployeesTableSeeder.php』を生成して、
php artisan make:seed EmployeesTableSeeder
先ほど作った『factory』と、生成したいダミーデータの数を追記します。
//Laravel/database/seeds/EmployeesTableSeeder.php <?php use IlluminateDatabaseSeeder; class EmployeesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // factory(AppEmployee::class, 50)->create(); //50個のダミーデータを生成 } }
『Seeder(シーダー)』の取りまとめ役の『DatabaseSeeder.php』にも追記して、
//Laravel/database/seeds/DatabaseSeeder.php <?php use IlluminateDatabaseSeeder; class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // $this->call(UsersTableSeeder::class); $this->call(DeptsTableSeeder::class); $this->call(EmployeesTableSeeder::class); } }
ここまでで、
php artisan migrate:refresh –seed
とやると、『ダミーデータ』が登録できてしまいます。
ただ一点注意点があって、『faker(フェイカー)』は初期設定だと英語でデータ生成しますので
もし日本語対応したい場合は『app.php』ファイルと『.env』ファイルに追記必要です。
■Laravel/config/app.php
/* |-------------------------------------------------------------------------- | Faker Setting |-------------------------------------------------------------------------- */ 'faker_locale' => env('DEV_FAKER_LOCALE', 'en_US'),
■Laravel/.env
DEV_FAKER_LOCALE=ja_JP
2つのファイルに追記した後に、
php artisan migrate:refresh –seed
のコマンドをうてば50件のダミーデータがものの10秒でできちゃいます。
さいごに
最初から一発でWebアプリなりソフトウェアがバッチリ完成できればいいのですが、
人間たるもの、どうしてもちょっとした間違いはでてくるし、
実際に作りながら、
なんて思いもでてきます。
今回はたった2つの、しかもかなり簡単な構成でしたが、
実際のWebアプリとなればテーブルだけで数十に及びますし、
その繋がりも山ほどでてくるので、
その度に手打ちで『ダミーデータ』をうっているととてもじゃないけど仕事にならなくなっちゃいます。
先人達が編み出した、『ダミーデータ』をさくっとつくる仕組みをうまいこと活用して、
さくっと仕事してさくっと帰れるような効率的な働き方をしていきたいもんです。
『Laravel』ではこんな記事も読まれています。
1. 【Laravel】マルチログイン対応ECサイトの講座をリリースしました【Udemy】2. 【PHP/Laravel】初心者向けの動画をリリースしました【Udemy】
3. 【Laravel(PHP)】初心者向け アプリのつくり方 をリリースしました【techpit】
4. 『Carbon』でよく使うパターンをまとめてみた【Laravel向け】
5. 【Laravel(PHP)】でできる事をわかりやすく(ざっくりと)まとめてみた【用語集も兼ねて】【初心者向け】
6. 【Laravel】フロントエンドをわかりやすくまとめてみた【初心者向け】
7. 【PHP】【Laravel】CSVエクスポートの方法〜5つのポイント〜
8. 【PHP】CSVインポートの方法〜大量データもバルクインサートでバッチリ!〜【laravel】
9. 【Laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfaker【初心者向け】
10. 【Laravel】Webアプリ環境構築の仕方【Vue.js】【初心者向け】
11. 【Laravel】と【Vue.js】のサンプル動画を見ながらさらりと解説してみる
12. 【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた【体験談】
13. 【Laravel】フォトギャラリーを作るための画像アップロード方法【php】
14. 【Laravel】多対多テーブルを複数つくる方法【ちょっとコツがいります】
15. 【Laravel】【Slack】に通知する方法をまとめてみた【自作ファサード】
アオキのツイッターアカウント。
この記事へのコメントはありません。