ダミーデータとは
テスト環境では機能や動作の確認したりするために大量のダミーデータが必要になります。
手動で作らず一括で大量のデータを挿入し作業が効率化します。
LaravelではSeedingという機能がありこれのおかげで、大量のダミーデータを一括で
テーブルに挿入することが可能です。
ダミーデータ挿入
ダミーデータの挿入法をみていきます。
DatabaseSeeder.php
ファイルを開いて、runメソッドに入っているコメントを削除します。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
\App\Models\User::factory(10)->create(); //この行のコメントを外す
$this->call(TasksTableSeeder::class);
//$this->call(FoldersTableseeder::class);
}
}
そして
$ php artisan db:seed
を実行します。これで10件のダミーデータが作成されます。
ダミーデータを利用して動作確認したい時に使えます。
seederクラスの作成
ダミーデータを作成するためには、ダミーデータを作成するクラスを作成する必要があります。
このクラスをLaravelではSeeder
と言います。
$ php artisan make:seeder FoldersTableSeeder
これでFoldersTableSeederが作成されます。
データを挿入
少ないデータ挿入の場合はrunメソッドにデータベースへのinsert文を直接記述します。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // ←これを追加
use Carbon\Carbon;
class FoldersTableseeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//
$titles = ["テスト","練習","実践"];
foreach($titles as $title){
DB::table('folders')->insert([
'title' => $title,
'user_id' => 3,
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
]);
}
}
}
DBを使う場合はuse Illuminate\Support\Facades\DB;も追記しておきましょう。
複数のデータ挿入
runメソッドに下記の1行を追加します。この1行を追加し、TasksTableSeederのrunメソッドが実行されるとTaskテーブルにダミーデータ50件分が挿入されます。
50を100に変更すれば100件のデータ挿入になります。
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Task;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
class TasksTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Task::factory()->count(50)->create();
//1件のデータ
// $titles = ["テスト","練習","実践"];
// foreach($titles as $title){
// DB::table('tasks')->insert([
// 'title' => $title,
// 'folder_id' => 3,
// 'due_date' => Carbon::now(),
// 'created_at' => Carbon::now(),
// 'updated_at' => Carbon::now(),
// ]);
}
}
Factory
FolderFactory.phpにFactoryやFakerを入れてダミーデータを作成します。
このクラスのことをModel Factory(モデルファクトリー)というみたいです。
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Folder>
*/
class FolderFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
//
'user_id' => User::factory(),
'title' =>$this->faker->text(30)
];
}
}
TaskFactoryにもFakerなどを入れていきます。
<?php
namespace Database\Factories;
use App\Models\Folder;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Task>
*/
class TaskFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'folder_id' => Folder::factory(),
'title' => $this->faker->text(30),
'due_date' =>$this->faker->dateTimeThisCentury(),
'Status' => 1,
];
}
}
ダミーデータを作成する準備が整えば、Seedの実行をします。
$ php artisan db:seed
テーブルの再作成
テーブルを再作成する時にダミーデータを挿入することもでき、その場合は
$ php artisan migrate:refresh –seed
を実行します。
refreshコマンドは一度すべてのテーブルを削除するのでテスト環境でのみ実行します。
本番環境で実行するとこれまでに保存してデータも削除されるのでNGです。
データの確認
データが入ったかを確認するにはtinker
を使います。
>>> $tasks = Task::all();
[!] Aliasing 'Task' to 'App\Models\Task' for this Tinker session.
=> Illuminate\Database\Eloquent\Collection {#4470
all: [
App\Models\Task {#4472
id: 1,
folder_id: 3,
title: "テスト",
due_date: "2022-04-22",
Status: 1,
created_at: "2022-04-22 04:21:34",
updated_at: "2022-04-22 04:21:34",
},
App\Models\Task {#4473
id: 2,
folder_id: 3,
title: "練習",
due_date: "2022-04-22",
Status: 1,
created_at: "2022-04-22 04:21:34",
updated_at: "2022-04-22 04:21:34",
},
App\Models\Task {#4474
id: 3,
folder_id: 3,
title: "実践",
due_date: "2022-04-22",
Status: 1,
created_at: "2022-04-22 04:21:34",
updated_at: "2022-04-22 04:21:34",
},
],
}
3件のデータが確認できました。
おまけでランダムにデータを確認する場合は
>>> $tasks = Task::all()->random();
=> App\Models\Task {#4476
id: 2,
folder_id: 3,
title: "練習",
due_date: "2022-04-22",
Status: 1,
created_at: "2022-04-22 04:21:34",
updated_at: "2022-04-22 04:21:34",
}
>>> $tasks = Task::all()->random();
=> App\Models\Task {#3531
id: 3,
folder_id: 3,
title: "実践",
due_date: "2022-04-22",
Status: 1,
created_at: "2022-04-22 04:21:34",
updated_at: "2022-04-22 04:21:34",
}
>>> $tasks = Task::all()->random();
=> App\Models\Task {#4473
id: 1,
folder_id: 3,
title: "テスト",
due_date: "2022-04-22",
Status: 1,
created_at: "2022-04-22 04:21:34",
updated_at: "2022-04-22 04:21:34",
}
>>> $tasks = Task::all()->random()->id;
=> 3
>>> $tasks = Task::all()->random()->id;
=> 1
>>>
>>> $tasks = Task::all()->random()->id;
=> 3
みたいな感じです。
他にもFactoryファイルの作成やSeederクラスの作成、DatabaseSeederの設定なども
ありますが下の参考資料を確認してください。
Fakerの資料
テストを行う上でFactry利用してダミーデータ生成しようと思ったらfakerを調べる必要があるみたいです。
おまけでlaravel createでupdated_atとcreated_atは呼び出されるみたいです。
資料
詳しく載っているので読んでください。