Laravel5.7でSeederとかFactoryとか

しばらくブランクがあったのでまとめ直し。

## SeederとFactory

Seederはデータベースにデータを（一括）挿入する仕組み。
FactoryはSeederにデータを与える仕組み（通常、Seederの中で呼び出す）。

両者とも便利であることはもちろん、データ生成をプログラムとして定義することで再現性、バージョン管理等が可能としている。

誤解を恐れず言えば、Factoryは必須ではない（Seeder内のプログラムで代用可能）。

## 利用してみる

### Seederファイルの作成

下記のコマンドを実行するとdatabase/seeds/以下にファイルが生成される。

```bash
php artisan make:seeder UsersTableSeeder
```

### Seederの登録

生成されたファイルはそのままでは利用できない(db:seedで生成されない）。
db:seedで生成対象とするためにはDatabaseSeeder.phpで登録を行う。

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

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        //コメントイン
        $this->call(UsersTableSeeder::class);
        //必要に応じて他のSeederファイルを追加
        //$this->call(AdminTableSeeder::class);
    }
}
```

### Seederファイルの編集

run()メソッドに必要な処理を実装する。
Factoryが複数件のダミーデータを生成する用に存在することを考えれば、Seeder自体ではテーブルに存在してほしいユーザーや情報を明示的に指定するのが妥当でしょうかね。

ここではtest1ユーザーを指定した名前、email、パスワードで生成している。

Factoryを利用せずともfor等でループしてもよい。

まあ「絶対こうしろ」というものがわるわけではない。

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

use Illuminate\Database\Seeder;
use App\User;
use Faker\Factory as Faker;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        //一括削除
        User::truncate();

        //特定のデータを追加
        User::create([
            'name' => 'test1',
            'email' => 'test1@test.com',
            'password' => Hash::make('testtest')
        ]);

        //必要ならfaker利用
        $faker = Faker::create('en_US');
        // $faker = Faker::create('ja_JP');

        //必要ならループ（ここをFactory使う）
        for($i = 0; $i < 10; $i++){
            User::create([
                'name' => $faker->name,
                'email' => $faker->email,
                'password' => Hash::make('testtest')
            ]);
        }

        //factoryを利用（結果は上記と同じ）
        factory(User::class, 10)->create();
    }
}
```

Factoryはmake:factoryで生成できる。UserFactoryは既にあるので、今回はそれをそのまま利用。

```bash
php artisan make:factory UserFactory
Factory already exists!
```

ファクトリーファイルの中身は下記のような感じ。Fakerが使われている。もちろん必須ではない。

```php:database/factories/UserFactory.php
<?php

use Faker\Generator as Faker;

$factory->define(App\User::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => Hash::make('testtest'), //使えるパスワードにしておく
        'remember_token' => str_random(10),
    ];
});
```

Seederの実行。

```bash
php artisan db:seed
```

下記のような感じで生成された（テーブルを一部抜粋）。
test1ユーザーは明示的に生成。
次の10件はforでループ。
次の10件はFactoryで生成されたもの。

```bash
+----+-----------------------+-------------------------------+-----------+----------------+
| id | name                  | email                         | password  | remember_token |
+----+-----------------------+-------------------------------+-----------+----------------+
|  1 | test1                 | test1@test.com                | $2y$10$zU | NULL           |
|  2 | Dr. Dejah Kuhlman Sr. | ebony39@hotmail.com           | $2y$10$6N | NULL           |
|  3 | Valentina Crist       | gibson.lillie@macejkovic.com  | $2y$10$zN | NULL           |
|  4 | Prof. Colton Haley V  | fredrick.mertz@kozey.com      | $2y$10$No | NULL           |
|  5 | Robin Schmitt         | blaze.johnston@gmail.com      | $2y$10$0M | NULL           |
|  6 | Berniece Bergstrom    | kreiger.kenny@greenfelder.com | $2y$10$XB | NULL           |
|  7 | Tyrel Hirthe          | lilly60@volkman.com           | $2y$10$Iw | NULL           |
|  8 | Cyrus Upton           | whoeger@hotmail.com           | $2y$10$O2 | NULL           |
|  9 | Prof. Mateo Hahn DVM  | jazlyn.schuster@emmerich.com  | $2y$10$J9 | NULL           |
| 10 | Janick Kulas          | lueilwitz.martina@hotmail.com | $2y$10$HT | NULL           |
| 11 | Ward Thiel            | tyra90@cummings.info          | $2y$10$Rt | NULL           |
| 12 | Eulalia Skiles        | vada.fay@example.org          | $2y$10$5g | 8QV0ucwmVZ     |
| 13 | Adolf Bogisich        | srempel@example.net           | $2y$10$4Y | JMv4lcCqeQ     |
| 14 | Monserrat Ernser MD   | woberbrunner@example.net      | $2y$10$bp | ZfuH7DLwyU     |
| 15 | Rahsaan Brown PhD     | dusty79@example.net           | $2y$10$/D | iPx5Tely3r     |
| 16 | Kris Collins          | xkuhn@example.org             | $2y$10$T/ | LnldjSrwLh     |
| 17 | Briana Kulas          | ben36@example.com             | $2y$10$CM | cyrmdEvGYh     |
| 18 | Dr. Everett Spencer   | ztorphy@example.com           | $2y$10$C. | e95b17WjU1     |
| 19 | Elyse Waters          | frederic.bode@example.com     | $2y$10$TZ | UbfcXQ6Mex     |
| 20 | Ali Fahey Jr.         | jazlyn.schulist@example.org   | $2y$10$RV | EWOsNNcdHJ     |
| 21 | Mrs. Madge Macejkovic | shania99@example.com          | $2y$10$iW | ELz6HVvDKh     |
+----+-----------------------+-------------------------------+-----------+----------------+
```

Faker自体の使い方は[こちら](https://qiita.com/zaburo/items/4487b23543ce88ce7f0c)を参考にどうぞ。