시딩이란
라라벨은 시더클래스를 통해서 데이터베이스에 더미 데이터를 넣을수 있는 기능을 제공한다.
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