Laravelでダミーデータ作成


# ダミーデータとは
テスト環境では機能や動作の確認したりするために大量のダミーデータが必要になります。
手動で作らず一括で大量のデータを挿入し作業が効率化します。
LaravelではSeedingという機能がありこれのおかげで、大量のダミーデータを一括で
テーブルに挿入することが可能です。


# ダミーデータ挿入
ダミーデータの挿入法をみていきます。
```DatabaseSeeder.php```ファイルを開いて、***runメソッドに入っているコメントを削除***します。

```DetabaseSeeder.php
<?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文を直接記述します。

```FoldersTableseeder.php
<?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件のデータ挿入になります。



```TasksTableSeeder.php
<?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(モデルファクトリー)というみたいです。


```FolderFactory.php
<?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などを入れていきます。
```TaskFactory.php
<?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を調べる必要があるみたいです。

https://qiita.com/tosite0345/items/1d47961947a6770053af

おまけで***laravel  createでupdated_atとcreated_atは呼び出される***みたいです。

# 資料
詳しく載っているので読んでください。

https://reffect.co.jp/laravel/larave-seeding-store-data-in-database#i-2