라라벨로고

[laravel] 데이터베이스 시딩

시딩이란

라라벨은 시더클래스를 통해서 데이터베이스에 더미 데이터를 넣을수 있는 기능을 제공한다.

1. 시더클래스

아티즌 명령어를 통해 시더를 생성한다. 생성된 클래스는 database/seeds에 생성 된다.

php artisan make:seeder UsersTableSeeder

시더파일을 정의하자

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class UsersTableSeeder extends Seeder
{
  public function run()
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => bcrypt('password'),
        ]);
    }
}

이제 시더를 실행하게되면 데이터베이스에 내용이 입력이 될 것이다.

php artisan db:seed --class=UsersTableSeeder

–class 옵션을 붙여주기 귀찮다면 DatabaseSeeder 에 시더를 등록해준다.

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(UsersTableSeeder::class);
    }
}

php artisan db:seed 실행해보면 데이터가 잘 들어가는 것을 확인할 수 있다. 마이그레이션에 –seed 옵션을 사용하면 편리하다.

php artisan migrate:refresh --seed

2. Eloquent 모델팩토리 사용하기

시더에 쿼리빌더를 통해 입력하는 방법보다 모델팩토리를 생성해서 시딩하는게 편리하다. 모델팩토리 생성 커맨드를 입력하자.

php artisan make:factory UserFactory

위에서 생성한 UsersTableSeeder, UserFactory는 라라벨에 이미 생성되어 있기때문에 생성할 필요가 없다. 설명을 위해서 설명하는것 뿐이다.

이제 시더클래스에 생성한 팩토리를 사용해보자.

factory(App\User::class, 50)->create();

기존 내용을 삭제하고 시더를 사용해서 새로운 데이터를 넣어보자

php artisan migrate:refresh --seed

3. 관계모델일때 시더정의하기

일대다인 모델을 정의하자.

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];

     protected $hidden = [
        'password', 'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function articles(){
        return $this->hasMany('App\Article');
    }
}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $fillable = [
        'subject', 'content',
    ];

    public function user(){
        return $this->belongsTo('App\User');
    }
}

팩토리 파일을 생성해준다. 옵션을 붙여 모델을 연결해주면 편리하다.

php artisan make:factory ArticleFactory --model=Article

생성된 파일을 열어 내용을 수정하자.

use App\Article;
use Faker\Generator as Faker;

$factory->define(Article::class, function (Faker $faker) {
    return [
        'subject' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => factory(App\User::class),
    ];
});

이제 UsersTableSeeder 클래스를 수정해주자.

    public function run()
    {
        factory(App\User::class, 50)->create()->each(function($user){
            $user->articles()->save(factory(App\Article::class)->make());
        });
    }

마이그레이션을 해보자.

php artisan migrate:refresh --seed

데이터베이스를 확인해보면 user 테이블과 aticles 테이블 관계에 따라 50개의 레코드가 생성된 것을 확인할 수 있다.


References

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다