見出し画像

[laravel8] Seeder

前回の記事でFactoryを作成した後にTinkerを使用しテストデータをデータベースのテーブルに挿入することができました。

今回はこのFactoryをコマンドから実行できるようにします。

DatabaseSeeder

あとでコマンドを実行してFactoryを実行しますが、そのコマンドが実行するファイルはseedersディレクトリの中にあるDatabaseSeeder.phpになります。

database/seeders/DatabaseSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
   /**
    * Seed the application's database.
    *
    * @return void
    */
   public function run()
   {
       \App\Models\User::factory(10)->create();
   }
}


このDatabaseSeederクラスのrunメソッドが実行されるわけですが、その中にあるデフォルトで記述されている

\App\Models\User::factory(10)->create();

はユーザーのfactoryを使用しているのがわかります。この場合10のユーザーのデータを作成してテーブルに挿入します。

Postデータを作成

前回の記事でPost(記事)のモデルのFactoryを以下のように作成しました。

database/factories/PostFactory.php

  public function definition()
  {
      return [
          'user_id' => User::factory,
          'category_id' => Category::factory,
          'title' => $this->faker->sentence,
          'slug' => $this->faker->slug,
          'excerpt' => $this->faker->sentence,
          'body' => $this->faker->paragraph 
      ];
  }

このPostモデルのfactoryをDatabaseSeederに記述します。

database/seeders/DatabaseSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Post;

class DatabaseSeeder extends Seeder
{
   /**
    * Seed the application's database.
    *
    * @return void
    */
   public function run()
   {
       Post::factory(5)->create();
   }
}

5つの記事データを作成するようにしています。

Post::factory(5)->create();

もちろんPostFactory.phpでユーザーとカテゴリーのFactoryも実行されるので、同時にユーザーとカテゴリーも5つずつ作成されます。

コマンド

seedのコマンドは以下になります。

php artisan db:seed

注意)ただしこのコマンドは実行する度にデータが消去されるわけではないので、実行するごとにデータが蓄積されていきます。

ただ、マイグレーションのリフレッシュを行うとテーブルが空になるので、その後にseedを実行すると自動的にデータが挿入されます。

php artisan migrate:fresh
php artisan db:seed

上の2つのコマンドを一回で実行するコマンドは以下になります。

php artisan migrate:fresh --seed

コマンドを実行すると記事データが5つ、ユーザーも5つ、カテゴリーも5つ挿入されています。

データの指定

Post::factory(5)->create();

上記が実行されると、記事、ユーザー、カテゴリーがランダムに5つずつ作成されるが、データを明示的に設定できます。

例を見てみます。

       User::factory()->create([
           'name' => 'john'
       ]);

ユーザーのデータを作成するときに上記の様にnameをjohnにするよう設定することができます。

これを利用してDatabaseSeederを変更します。

database/seeders/DatabaseSeeder.php

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Post;
use App\Models\User;

class DatabaseSeeder extends Seeder
{
   /**
    * Seed the application's database.
    *
    * @return void
    */
   public function run()
   {
       $user = User::factory()->create([
           'name' => 'john'
       ]);
       
       Post::factory(5)->create([
           'user_id' => $user->id
       ]);
   }
}

名前がjohnのユーザーを作成し、

       $user = User::factory()->create([
           'name' => 'john'
       ]);

そのユーザーのIDを使い記事を5つ作成しています。

       Post::factory(5)->create([
           'user_id' => $user->id
       ]);

テーブルを確認してみると

ユーザーのテーブル

スクリーンショット 2021-06-16 22.35.33

記事のテーブル

スクリーンショット 2021-06-16 22.35.40

記事のuser_idには1だけが入っていますね。

最後に

今回はコマンドからテストデータを挿入できるようseedのコマンドを勉強しました。これでテーブルの構成が変わりmigrationファイルを変更するたびに手作業でデータを入力していく必要がなくなりました。

ここまでのファイルは以下になります。


この記事が気に入ったらサポートをしてみませんか?