Laravel8 시더, 모델 팩토리 배열에서 속성을 덮어쓰고 테스트 데이터 만들기

12265 단어 PHPlaravel8라라벨

소개



Laravel8의 시더, 모델 팩토리로 배열을 사용해 속성을 덧쓰기해 테스트 데이터를 작성하는 tips입니다.

환경


  • PHP8.0.1
  • Laravel 8.23.1

  • 준비



    아래 모델과 모델 팩토리가 있다고 가정하여 시더를 만듭니다.

    마이그레이션



    database/migrations/1970_01_01_000001_create_companies_table.php
    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class CreateCompaniesTable extends Migration
    {
        public function up()
        {
            Schema::create('companies', function (Blueprint $table) {
                $table->bigIncrements('id');
                $table->string('name');
                $table->integer('capital');
                $table->timestamps();
            });
        }
    
        public function down()
        {
            Schema::dropIfExists('companies');
        }
    }
    

    모델



    app/Models/Company.php
    <?php declare(strict_types=1);
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class Company extends Model
    {
        use HasFactory;
    
        protected $guarded = [
            'id',
            'created_at',
            'updated_at',
        ];
    
        protected $casts = [
            'name' => 'string',
            'capital' => 'int',
        ];
    }
    

    모델 팩토리



    database/factories/CompanyFactory.php
    <?php declare(strict_types=1);
    
    namespace Database\Factories;
    
    use App\Models\Company;
    use Illuminate\Database\Eloquent\Factories\Factory;
    
    class CompanyFactory extends Factory
    {
        protected $model = Company::class;
    
        public function definition()
        {
            return [
                'name' => $this->faker->company,
                'capital' => (int) round($this->faker->numberBetween(1000, 10000), -2),
            ];
        }
    }
    

    시더



    database/seeders/CompaniesTableSeeder.php
    <?php declare(strict_types=1);
    
    namespace Database\Seeders;
    
    use App\Models\Company;
    use Illuminate\Database\Eloquent\Factories\Sequence;
    use Illuminate\Database\Seeder;
    
    class CompaniesTableSeeder extends Seeder
    {
        public function run()
        {
            // 全件削除
            Company::truncate();
    
            // 1件データを作る
            Company::factory()->create();
    
            // 5件データを作る
            Company::factory(5)->create();
    
            // 5件データを作る(countでも良い)
            Company::factory()->count(5)->create();
    
            // capital(資本金)が5000のデータ5件を作る
            Company::factory(5)->create(['capital' => 5000]);
    
            // name(会社名)を指定したデータ5件を作る
            $companies = [
                ['name' => '株式会社A'],
                ['name' => '株式会社B'],
                ['name' => '株式会社C'],
                ['name' => '株式会社D'],
                ['name' => '株式会社E'],
            ];
            Company::factory(count($companies))
                ->state(new Sequence(...$companies))
                ->create();
    
            // capital(資本金)が1000,5000を交互に入れるデータ5件を作る
            Company::factory(count($companies))
                ->state(new Sequence(
                    ['capital' => 1000],
                    ['capital' => 5000]
                ))
                ->create();
        }
    }
    

    DB 내용



    위의 시더를 실행하면 이러한 데이터가 생성됩니다.



    연속적인 데이터를 만드는 경우는 Illuminate\Database\Eloquent\Factories\Sequence 를 사용하면 깨끗이 쓸 수 있습니다.
    꼭 사용합시다!

    관련 기사


  • Laravel8에서 완성된 ModelFactory 사용법

  • 참고


  • 모델 팩토리 정의 | Laravel 8.x 데이터베이스 테스트
  • 좋은 웹페이지 즐겨찾기