フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

Laravel8でFactoryを使ってみる

はじめに

ファクトリの生成

php artisan make:factory ContactFormFactory

fakerの生成されるデータを日本語にする設定

  • config/app.phpファイルの下記の設定を日本語に変更する
//    'faker_locale' => 'en_US',
    'faker_locale' => 'ja_JP',
  • database/factories/ContactFormFactory.phpファイルが生成される。
  • definition()関数に登録したいデータの設定をする
<?php

namespace Database\Factories;

use App\Models\ContactForm;
use Illuminate\Database\Eloquent\Factories\Factory;

class ContactFormFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = ContactForm::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            //
            'name' => $this->faker->name,       
            'email' => $this->faker->unique()->email,
            'url' => $this->faker->url,
            'sex' => $this->faker->randomElement(['0', '1']),
            'age' => $this->faker->numberBetween($min = 1, $max = 6),
            'description' => $this->faker->realText(200),
            'subject' => $this->faker->realText(50)
        ];
    }
}

Seederを作成する

php artisan make:seeder ContactFormSeeder
  • Seederを作成する。下記の例は100件データを登録する。laravelのバージョンにより記述方法が異なるので注意が必要

stackoverflow.com

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\ContactForm;

class ContactFormSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
        ContactForm::factory()->count(100)->create();
    }
}
  • database/seeders/DatabaseSeeder.phpに作成したSeederを追加する
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // \App\Models\User::factory(10)->create();
        $this->call(UsersTableSeeder::class);
        $this->call(ContactFormSeeder::class);
    }
}
  • 下記のコマンドを実行しないと追加したSeederが存在しないと言われてしまう。
$ composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: encore/laravel-admin
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Generated optimized autoload files containing 5239 classes
  • Fakerを指定したSeederを実行する
php artisan db:seed --class=ContactformSeeder

実行結果

mysql> select count(*) from contact_forms;
+----------+
| count(*) |
+----------+
|      101 |
+----------+
1 row in set (0.00 sec)