内容
シーディングについてメモしておきます。
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