Laravel ダミーデータ登録(seeder, factory, faker)

# ダミーデータの登録

- seeder: ダミーデータを登録する
    - 少量のデータであればこれだけでOK
- factory: ダミーデータを量産する装置
- faker: 装置を使用してダミーデータを生成する


## 少数のデータ登録の場合
### seederを作成し、データを直に入れる

```shell
$ php artisan make:seed UsersTableSeeder
```


```php:UsersTableSeeder
public function run()
    {
        // $this->call(UsersTableSeeder::class);
        DB::table('depts')->insert([
        ['id' => '1',
        'name_id' => '1',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ],
        [
        'id' => '2',
        'name_id' => '2',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ]
    }   
```


### モデルごとに作成したseederを紐付ける


```php:DatabaseSeeder.php
public function run()
    {
          $this->call(UsersTableSeeder::class);
    }
```

### 登録

```shell
$ php artisan db:seed
$ php artisan db:seed --class=UsersTableSeeder
# データベース初期化する場合
$ php artisan migrate:refresh --seeder
```


## 多数のデータ登録の場合
### factoryの作成

```shell:
$ php artisan make:factory UserFactory
```

# 生成したfactoryファイルにfakerを使って生成する
生成したfactoryファイルのModelと書かれたところを、使用するModel名に変更する

```php:UserFactory.php
$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name(),
        'email' => $faker->email,
        'password' => $faker->password, // password
        'created_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),
        'updated_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get())
    ];
});
```

### seederを作成する

```shell
$ php artisan make:seed UsersTableSeeder
```


使用するfactoryと生成するダミーデータの個数を追記する

```php:UsersTableSeeder
class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(User::class, 50)->create();
    }
}
```

## モデルごとに作成したseederを紐付ける

```php:DatabaseSeeder.php
public function run()
    {
          $this->call(DeptsTableSeeder::class);
    }
```

### 登録

```shell
$ php artisan db:seed
$ php artisan db:seed --class=UsersTableSeeder
# データベース初期化する場合
$ php artisan migrate:refresh --seeder
```


# (補足)日本語のダミーデータを登録する

デフォルトでは英語のダミーデータが生成されが、設定すれば日本語のダミーデータが生成できるようになる


```php:config/app.php
'faker_locale' => env('APP_FAKER_LOCALE', 'ja_JP')
```

```php:.env
// 追記
APP_FAKER_LOCALE=ja_JP
```

上記2ファイルの設定が終わると、次のコマンドでキャッシュを更新して登録すれば日本で登録される

```shell
$ php artisan config:cache
# 次のコマンドを打つと壊れるので注意
$ php artisan config:clear
```

# (補足)使えそうなfakerリスト

```php:
'name' => $faker->name(),
'email' => $faker->email,
'password' => $faker->password, // password
'created_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),
'updated_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),

$faker->sentence(rand(1,4)), // 1〜4つの単語で文章
$faker->realText(512), // 512文字の文章 
$faker->word() // 単語
$faker->sentence(n) //単語数指定した文章
$faker->text($max) //$max文字数までの文章
$faker->name() //名前 （日本語）
$faker->realText() //文字数指定した文章　デフォルトは200（日本語）
$faker->phoneNumber() //電話番号（日本語）
$faker->address() //住所（日本語）
$fake->company() //会社名（日本語）
$faker->randomElement(['男性', '女性'])
```

# (補足)リレーション関係でのfaker

```php:
use App\User
'user_id' => factory(User::class)->create()->id,
```

## 参考

- やり方
https://coinbaby8.com/laravel-seeder-factory-faker.html
- fakerチートシート
https://qiita.com/tosite0345/items/1d47961947a6770053af