LoginSignup
0
0

More than 3 years have passed since last update.

【Laravel】シーディング

Posted at

内容

シーディングについてメモしておきます。

factoryファイルの作成

UserFactoryはデフォルトで作成されています。
ここではuser_idを外部キーにもつPostモデルのfactoryファイルを作成してみます。

% php artisan make:factory PostFactory --model=Post

--modelオプションでモデルを指定しています。
ファイルの中身は、例えば以下のようにします。

database/factories/PostFactory.php
use Illuminate\Support\Str;

$factory->define(Post::class, function (Faker $faker) {
    return [
        'title' => $faker->title(),
        'comment' => Str::random(10),
    ];
});

指定していないcreated_atやupdated_atなどは自動生成してくれるようです。
user_idは下の方で説明する書き方をすれば自動に値を入れてくれます。

seederファイルの作成

% php artisan make:seeder UserSeeder
database/seeds/UserSeeder.php
    public function run()
    {
        for ($i = 0; $i < 50; $i++) {
            $user = factory(User::class)->create(['name' => 'user'.$i]);
            $posts = [];
            for($j = $i * 10; $j < $i * 10 + 10; $j++) {
                array_push($posts, factory(Post::class)->make([
                    'title' => 'title'.$j,
                    'comment' => 'comment'.$j,
                ])->toArray());
            }
            $user->posts()->createMany($posts);
        }
    }

見慣れない記述ですが、titleとcommentに連番をつけたかったので、上のような書き方をしました。

factory(User::class)->create();
で一つのデータが作成されます。create()の引数を指定することで、値をオーバーライドできます。
1対多のリレーションでは、createMany()を利用するといいでしょう。引数は配列にする必要があります。

DatabaseSeeder.php

database/seeds/DatabaseSeeder.php
    public function run()
    {
        $this->call([
            UserSeeder::class,
        ]);
    }

run()内のcallメソッドの引数に実行するSeederを指定します。

オートローダ

Seederファイルを作成したら、以下のコマンドを実行して、オートローダを再生成しましょう。

% composer dump-autoload

シーディング

% php artisan db:seed
0
0
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
0
0