laravelでファクターを使用してseederを実行した

laravel6でseederを実行するのに、
初めてfactorieを使用したのでまとめます。

factories＝seederファイルを挿入するDBを作成する工場のイメージ。


①マイグレーションの作成。
②シーダーの作成。
③モデルの作成。
④ファクトリーの作成。
⑤seederの実行。
の順番に作成しました。

①マイグレーションの作成。
・作成したマイグレーションファイル。
```ruby:users_table
$table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->string('image_path')->nullable();
            $table->string('text')->nullable();
            $table->rememberToken();
            $table->timestamps();
```
```ruby:movies_table
Schema::create('movies', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('image_path');
            $table->string('title');
            $table->string('director');
            $table->string('release');
            $table->string('evaluation');
            $table->string('viewing');
            $table->string('review');
            $table->unsignedBigInteger('user_id');
            $table->timestamps();

            //外部キー制約、user情報が削除されたら映画テーブルも削除される
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
```

```ruby:movies_table
Schema::create('genres', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        });
```

②シーダーの作成。
```ruby:GenresTableSeeder
<?php

use Illuminate\Database\Seeder;
use Carbon\Carbon;
use App\Genre;

class GenresTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $now = Carbon::now();
        $dataArray = [
            [
                'name' => 'アニメ',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => 'ドラマ',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => '恋愛',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => 'ホラー',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => 'アート・コンテンボラリー',
                'created_at' => $now,
                'updated_at' => $now,
            ],
            [
                'name' => '戦争',
                'created_at' => $now,
                'updated_at' => $now,
            ],
        ];
        foreach($dataArray as $data) {
            DB::table('genres')->insert($data);
        };
    }
}

```
```ruby:UsersTableSeeder
<?php

use Illuminate\Database\Seeder;
use App\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(User::class, 50)
            ->create()
            ->each(function ($user) {
                $user->movies()->save(factory(App\Movie::class)->make());
            });
    }
}
```
Moviesテーブルの中に外部キーを使用するので、
```
->each(function ($user) {
                $user->movies()->save(factory(App\Movie::class)->make());
```
を記述。

③モデルの作成。
```User.php
protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function movies()
    {
        return $this->hasMany(Movie::class);
    }
```
userテーブル→親。
movieテーブル→子。
の関係なので、hasManyを記述。
```Movie.php
class Movie extends Model
{
    protected $fillable = ['image_path','title','director','release','evaluation','viewing','review','user_id'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
```
Movieテーブル→子なので、
belongsToを記述。

④ファクトリーの作成。
```UserFactory.php
factory->define(User::class, function (Faker $faker) {
    return [
        //名前を入力
        'name' => $faker->name(),
        //メールアドレスを入力
        'email' => $faker->unique()->safeEmail,
        //seeder実行時の時間を入力
        'email_verified_at' => now(),
        //パスワードを入力
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        //10文字の数字とアルファベットをランダムに自動入力
        'image_path' => Str::random(10),
        //255文字を自動入力
        'text' => $faker -> realText(255),
        //10文字の数字とアルファベットをランダムに自動入力
        'remember_token' => Str::random(10),
    ];
});
```
既存のFactoryファイルにimage_pathとtxetを記述。
ファクトリの記述方法はこちらに詳しくまとめられております。
https://qiita.com/shin1kt/items/022c2b8d576c203d8cf1
https://qiita.com/kurosuke1117/items/c672405ac24b03af2a90
https://qiita.com/rope19181/items/a0df89275bb24193d4ac

⑤seederの実行。
seederを実行する前に
```
composer dump-autoload
```
コマンドを実行。
その後、
```
php artisan db:seed
```

マイグレーションとシーダーを同時に実行する場合。
```
 php artisan migrate:fresh --seed

```