3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelでダミーデータ作成

Last updated at Posted at 2022-04-30

ダミーデータとは

テスト環境では機能や動作の確認したりするために大量のダミーデータが必要になります。
手動で作らず一括で大量のデータを挿入し作業が効率化します。
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を調べる必要があるみたいです。

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

資料

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?