Laravelでfakerを利用し、Eloquentのcursor()・all()・chunk()の速度を計測するために、テストの点数のデータを登録してみた(第1回)

◆目的
<b>最終的に、laravelのeloquentのcursor()・all()・chunk()の速度を計測する</b>
<b>今回：テストの点数データの登録まで</b>
##◆model・migrationファイル作成
まず、テーブルを作成する。

```:コマンド
php artisan make:model Models/Student -m
```

```:migrationファイル
class CreateStudentsTable extends Migration
{
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name', 20)->comment('名前');
            $table->bigInteger('japanese')->comment('国語');
            $table->bigInteger('math')->comment('数学');
            $table->bigInteger('english')->comment('英語');
            $table->bigInteger('social_studies')->comment('社会');
            $table->bigInteger('science')->comment('理科');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('students');
    }
}
```

名前とご科目の点数を入れるカラムを用意した。

```:コマンド
php artisan migrate
Migrating: 2019_04_07_085555_create_students_table
Migrated:  2019_04_07_085555_create_students_table
```

テーブル作成完了

```:modelクラス
class Student extends Model
{
    //明示的にテーブルと紐づけ(記載しない場合、Model名の複数形のテーブルと紐づく(今回ならstudents))
    protected $table = 'students';

    //複数代入に代入を許可しないカラム(主キーなどを設定する)
    protected $guarded = ['id'];

    //データが入ったときに自動でcreated_atとupdate_atにデータが入ることを明示的に表示
    public $timestamps = true;

    //複数代入時に代入を許可するカラム
    protected $fillable = ['name', 'japanese', 'math', 'english', 'social_studies', 'science'];
}
```

設定完了

##◆factory・fakerの利用
今回は、速度計測が最終目標のため、一つ一つデータを入れず、factory・fakerを使って、ランダムなデータを大量に入れていきたいと思う。

<b>faker：ダミーデータの作成</b>
<b>factory：DBにレコードを登録するときの便利クラス</b>

```:コマンド
//ファクトリークラスの作成
php artisan make:factory StudentFactory
```

```:StudentFactory
$factory->define(Student::class, function (Faker $faker) {
    return [
        'name'           => $faker->name,
        'japanese'       => $faker->numberBetween(0, 100),
        'math'           => $faker->numberBetween(0, 100),
        'english'        => $faker->numberBetween(0, 100),
        'social_studies' => $faker->numberBetween(0, 100),
        'science'        => $faker->numberBetween(0, 100),
    ];
});
```

名前はランダムで、点数は0～100点をランダムで生成してもらうことにした。
[fakerで設定できるもの]https://qiita.com/tosite0345/items/1d47961947a6770053af

名前を日本語で登録してもらうために、

```:config\app.php
'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
```

```:env
APP_FAKER_LOCALE=ja_JP
```

```:コマンド
//設定変えたので、キャッシュクリア
php artisan config:cache
```

[日本語設定]
https://qiita.com/shima_6_you/items/83af3b9fe79387d82286

データ登録用にSeederファイルを作成する

```:コマンド
php artisan make:seed StudentsTableSeeder
```

```:StudentsTableSeeder
class StudentsTableSeeder extends Seeder
{
    public function run()
    {
        factory(Student::class, 10000)->create();
    }
}
```

ファクトリーメソッドで、10000件登録する。

```:DatabaseSeeder 
class DatabaseSeeder extends Seeder
{
    public function run()
    {
         $this->call(StudentsTableSeeder::class);
    }
}
```

実行するSeederファイルを加えて、コマンドでデータを入れてみる。

```:コマンド
php artisan db:seed
Seeding: StudentsTableSeeder
Database seeding completed successfully
```

10000件登録完了

##◆まとめ
長くなりそうなので、今回はfacker・factoryを利用して、データの登録までを行った。
次回以降、all()・chunck()・cursor()の速度を図りたいと思う。