데이타베이스를 migration 한 후에 초기 데이타를 입력해야 하는 경우가 있습니다. 예로 웹 기반 CMS(Content Management System) 이라면 초기 관리자 정보가 있어야 로그인하고 기본적인 설정을 할 수 있습니다.

 

시딩은 초기 데이타를 입력하는 간단한 방법을 제공하며 모든 시드 클래스는 database/seeds 폴더안에 CustomerTableSeeder.php 처럼 Schema  이름 + TableSeeder.php 형식으로 존재합니다.

 

시드 생성

시드는 make:seeder artisan 명령어로 생성할 수 있습니다. 먼저 users 테이블에 대한 시드 클래스를 만들겠습니다.

$ php artisan make:seeder UserTableSeeder
Seeder created successfully.
CODE

생성된 database/seeds/UserTableSeeder.php 파일을 열고  run() 메소드에 테이블에 넣어줄 초기 데이타를 입력해 주면 됩니다.

database/seeds/ProjectTableSeeder.php

<?php

use Illuminate\Database\Seeder;

class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        App\User::create([
        	'name' => 'lesstif',
        	'email' => 'foo@bar.com'
        	]);
    }
}
PHP

 

전 절에서 만든 projects 테이블에 대한 시드 클래스를 만들어 봅시다.

$ php artisan make:seeder ProjectTableSeeder
Seeder created successfully.
CODE

 

생성된 database/seeds/ProjectTableSeeder.php 파일을 열고 run() 메소드를 수정합니다.

database/seeds/ProjectTableSeeder.php

<?php

use Illuminate\Database\Seeder;

class ProjectTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $prjs = ['개인', '업무', '학습', '쇼핑'];
       	foreach($prjs as $prj) 
       	{
	        DB::table('projects')->insert([
	            'name' => $prj,
	            'created_at' => \Carbon\Carbon::now(),
	            'updated_at' => \Carbon\Carbon::now(),
	        ]);
	    }
    }
}
PHP

'개인', '업무', '학습', '쇼핑' 4 개의 프로젝트를 배열로 만든 후에 DB::table('projects')->insert() 문을 사용하여 초기 데이타로 넣었습니다. 데이타의 생성일과 갱신일을 의미하는 created_at, updated_at 은 PHP 의 DateTime 유틸리티인 Carbon 을 사용하여 현재 시간으로 설정했습니다.

 

이제 Tasks 테이블에 초기 데이타를 넣기 위해 먼저 make:seeder 명령어로 시딩 클래스를 생성합니다.

$ php artisan make:seeder TaskTableSeeder
Seeder created successfully.
CODE


생성된 database/seeds/TaskTableSeeder.php 파일을 열고 run() 메소드에 아래와 같은 내용을 추가합니다.

database/seeds/TaskTableSeeder.php

<?php

use Illuminate\Database\Seeder;

class TaskTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {   
		// 20개의 task 를 4개의 project 와 연결
       	for($i = 0; $i < 20; $i++)
       	{
	        DB::table('tasks')->insert([
	        	'project_id' => rand(1,4) , 
	            'name' => 'Task ' . $i,
	            'description' => 'Task ' . $i,
	            'created_at' => \Carbon\Carbon::now(),
	            'updated_at' => \Carbon\Carbon::now(),
	        ]);
	    }
    }
}
PHP
  • project_id => rand(1,4) : 개별 task는 프로젝트에 속해야 하며 ProjectTableSeeder에서 4개의 프로젝트를 입력했으므로 id 는 [1, 2, 3, 4] 가 되므로 1과 4 사이의 값을 만들려고 rand(1,4) 를 사용했습니다.

 

이제 만들어진 시딩을 테이블에 반영할 순서이며 어떤 시딩 클래스를 적용할지와 시딩 순서는 database/seeds/DatabaseSeeder.php 파일을 통해 설정됩니다.

 

run() 메소드에 호출할 시딩 클래스 이름을  $this->call() 메소드를 사용하여 unguard() 와 reguard() 사이에  넣어주면 되며 파라미터는 시딩할 클래스 이름으로 'ProjectTableSeeder'  처럼 문자열로 넘기거나 혹은 ProjectTableSeeder::class 처럼 클래스 이름을 결정해주는 구문을 사용하면 됩니다.

public function run()
{
    $this->call('UserTableSeeder');  
    $this->call('ProjectTableSeeder');		
    $this->call('TaskTableSeeder');
}
CODE

먼저 적어준 시딩 클래스가 먼저 호출되므로 Users, Projects, Tasks 테이블 순으로 실행해야 합니다.

 

이제 초기 데이타가 완성되었으니 artisan db:seed 명령어로 시드 데이타를 데이타베이스에 입력하겠습니다.

$ php artisan db:seed         
Seeded: UserTableSeeder
Seeded: ProjectTableSeeder
Seeded: TaskTableSeeder
CODE

 

이제 MySQL 클라이언트로 projects 와 tasks 테이블을 조회해 보면 초기 데이타가 입력되었음을 확인할 수 있습니다.

"[ReflectionException] Class UserTableSeeder does not exist" 와 같은 에러가 발생하며 시딩이 안 될 경우 다음 명령어를 실행해 주면 됩니다.
composer dump-autoload
CODE