laravel5.5　シーダーファイルについてまとめる

#シーダとは
データベースのテーブルにダミーのレコードを準備する機能
「シーディング」と呼ばれる。これは、シード(最初から用意しておくレコード)を生成する機能

主な手順は3つ
①シーディングのためのシーダーファイルを生成する。
②シーディングファイルを編集してシードを追加していく
③コマンドでシーディングを実行する

#シーディングのためのシーダファイルの生成方法
Laravelのappアプリ名ディレクトリ直下で以下のコマンドを実行

```
php artisan make:seeder ファイル名(例　UserTableSeeder)
```

database/seedsにファイルが生成されているため編集

```php:database/seeds/UserTableSeeder
DB::table('employees')->insert([
        [
            'name' => 'テストユーザー１',
            'email' => 'test1@example.com',
            'password => Hash::make('password'),
         ],
        [
            'name' => 'テストユーザー2',
            'email' => 'test2@example.com',
            'password => Hash::make('password'),
        ],
        [
            'name' => 'テストユーザー3',
            'email' => 'test3@example.com',
            'password => Hash::make('password'),
        ],
```

変数にして導入することも可能

```php:database/seeds/UserTableSeeder.php
<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class AdminTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $param =[
            'name' => 'テストユーザー１',
            'email' => 'test1@example.com',
            'password => Hash::make('password'),
        ];

        DB::table('admins')->insert($param);
    }
}
```
**ポイント**
パスワードをデータベースに格納する場合はハッシュ化して格納しましょう
'password' => Hash::make('password');
[Hash::makeとは](https://office-goto.info/laravel/hash-make/)

#シーダファイルの登録
作成したシーダファイルが実行されるように、デフォルトで用意されているDatabaseSeederに登録する必要がある。


```
$this->call(シーダクラス::class);
```

デフォルトのDatabaseSeederに記述を追加していきます。
例えば、UserTableSeederクラスとAdminTableSeederクラスを実行する場合は下記のように記述します。

```php:database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserTableSeeder::class);
        $this->call(AdminTableSeeder::class);
    }
}
```

実行するシーダークラスのclassをプロパティを引数にして[call]というメソッドを呼び出します。これはSeederクラスにあるメソッドで、これにより指定したクラスのrunメソッドが呼び出され、シーディング処理されるようになります。

#シーディングを実行する
以下のコマンドを実行してDatabaseSeederのrunが実行され、そこから各シーダーファイルのrunが呼び出されて実行されます。結果、データベースに格納されているはずです。

```
php artisan db:seed
```

個別のseederクラスのみ実行する場合はコマンドでクラスを指定する

```
php artisan db:seed --class=UsersTableSeeder
```

**シーディングした内容を戻す方法**
以下のコマンドを叩く事でロールバック（定義したテーブル全削除）→テーブル再構築→シーディング実行（初期データ投入）までを１つのコマンドで行えます。

```
php artisan migrate:refresh --seed
```

#大量のデータを格納する場合は、フェイカーとモデルファクトリの利用
もちろんそれぞれのモデルシーダで属性をいちいち指定するのは面倒です。代わりに大量のデータベースレコードを生成するのに便利なモデルファクトリが使用できます。ァクトリが定義できれば、データベースにレコードを挿入するfactoryヘルパ関数が利用できます。

ファクトリーファイルの中でフェイカー使って ダミーデータを作成します。

例として50件のレコードを生成し、それぞれのユーザーへリレーションを付加してみましょう。

```
php artisan make:factory BookFactory
```

```
?php

use Faker\Generator as Faker;

$factory->define(App\Book::class, function (Faker $faker) {
    $now = \Carbon\Carbon::now();
    return [
        'isbn' => $faker->isbn13,
        'published_date' => $faker->date($format = 'Y-m-d', $max = 'now'),
        'price' => $faker->randomNumber(4),
        'created_at' =>$now,
        'updated_at' => $now
    ];
});
```
シーダーファイルにファクトリの内容を追記

```
<?php
 
use IlluminateDatabaseSeeder;
 
class BooksTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
    //
    factory(AppBooks::class, 50)->create(); //50個のダミーデータを生成
    }
}
```

参考にしたサイト
https://coinbaby8.com/laravel-seeder-factory-faker.html
https://qiita.com/tosite0345/items/1d47961947a6770053af
https://laraweb.net/knowledge/2302/