Seederとは
データベースにあらかじめデータが欲しい時に、Seederを使用すれば楽に用意ができる
Factoryとは
Factoryを使用すると意図したModelのデータを定義しておけば、任意のタイミングでFactoryを使えばModelインスタンスを呼び出せる。テストやSeederを使用するときに利用する
FactoryをSeederで使用する
FactoryをSeederで使用すると複数データを用意する場合にfor文を書かなくていいので、簡潔にコードが書ける。いくつかRelationがあっても簡潔に書ける。
仮のモデルのコード
namespace App;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $fillable = [
'title', 'content',
];
public function post_images()
{
return $this->hasMany(PostImage::class, 'post_id', 'id');
}
public function user() {
return $this->belongsTo(User::class);
}
}
1対多でPostImage、多対1でUserとRelationを設定してある
Factoryを作成する
-
- artisanコマンドの実行
php artisan make:factory PostFactory
database/factoriesにPostFactory.phpが作成される
-
- PostFactory.phpの編集
use Faker\Generator as Faker;
$factory->define(App\Post::class, function (Faker $faker) {
return [
'title' => $faker->realText(100),
'content' => $faker->realText(3000)
];
});]
Fakerを使ってFactoryでModelを生成する際の標準のダミーデータをセットできる
Seederを作成する
-
- artisanコマンドの実行
php artisan make:seeder PostsTableSeeder
database/seedsにPostsTableSeeder.phpが作成される
-
- PostsTableSeeder.phpの編集
use Illuminate\Database\Seeder;
class PostsTableSeeder extends Seeder
{
public function run()
{
// factoryを利用
factory(App\Post::class, 10)
->create(['title' => 'test'])
->each(function(App\Post $post) {
$post->post_images()->saveMany(factory(App\PostImage::class, 3)->make());
$post->user()->associate(factory(App\User::class)->create());
});
// factoryを利用しない場合(Relationはめんどいので省略)
$faker = Faker::create('ja_JP');
for ($i = 1; $i <= 10; $i++) {
Post::create([
'title' => $faker->realText(100),
'content' => $faker->realText(3000)
]);
}
}
}
factoryメソッドで生成するModelと個数を指定して、ModelのCollectionをcreateする
createするときにPostFactoryで指定した値をパラメーターごとに変更が可能
Collectionのeachを呼ぶことで、各Modelのリレーションを表現できる
each内でもfactoryを使うことでリレーションも簡潔に記述できる