LoginSignup
27
30

More than 3 years have passed since last update.

LaravelのSeederはFactory使うとリレーションしてても簡潔にかける

Posted at

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を作成する

  • 1. artisanコマンドの実行
php artisan make:factory PostFactory

database/factoriesにPostFactory.phpが作成される

  • 2. 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を作成する

  • 1. artisanコマンドの実行
php artisan make:seeder PostsTableSeeder

database/seedsにPostsTableSeeder.phpが作成される

  • 2. 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を使うことでリレーションも簡潔に記述できる

27
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
30