手軽にデータを準備!Laravel Seederの基本と使い方

Laravel

こんにちは!

今回はLaravelのデータ投入機能であるSeederの使い方をご紹介していきます。

開発を行っていると、開発環境などでテストデータを準備する際や、あらかじめデータをDBに入れておきたいことなどは頻繁にあるかと思います。
Laravelでは、このような場合に効率よくデータを準備する機能が用意されています。
それが、本記事でご紹介するSeederです。

読者
読者

「Laravelのseederってそもそも何?」

「Laravelのseederの実装方法は?」

「Laravelでデータを効率よく準備する方法はあるのかな?」

このようにお考えの方は参考になるかと思います。

本記事を読めば、以下のようなことがわかります。

  • そもそもSeederとは何か
  • Seederを使ったデータ投入の方法

サンプルコードを交えて、わかりやすく解説していくので、ぜひ最後まで読んでいってください。

Seederとは

既に冒頭で少し触れてしまいましたが、Seederとはデータを効率よく準備するためのLaravelに備わっている機能の一つです。

何か複数のデータをDBに入れたい時、一つ一つデータをDBに保存していくのは大変ですよね。
数件しかなければ、手動で保存してもいいのですが、これが100件200件とあると手動ではかなり時間がかかってしまいます。

そこで、Seederを使えばプログラムによって自動的にデータをDB保存することができるため、便利です。

Laravelでデータ準備する場合は、このSeederが最も基本的な方法になるので、ぜひ覚えていってください。

Seederを使ったデータ投入方法

ここからは実際にSeederを使ってデータ投入する手順を見ていきましょう。

Seederファイル作成

まずは、Seederファイルを作成しましょう。

ここは、簡単にファイルを作成してくれるmake:seederコマンドが用意されていますので、こちらを使います。

$ php artisan make:seeder UserSeeder

こちらを実行すると、「database/seeders/UserSeeder.php」が作成されます。

Seederファイル編集

それでは、作成されたSeederファイルの中身を見てみましょう。

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        //
    }
}

ファイルの中にrun()メソッドが定義されてしますが、ここでSeederの処理を実行します。

それでは、ユーザーデータが3件登録されるように処理を書いてみます。

use App\Models\User;
use Illuminate\Support\Facades\Hash;

public function run(): void
{
    User::insert([
      [
        'name' => 'admin',
        'email' => 'admin@example.com',
        'password' => Hash::make('adminpass')
      ],
      [
        'name' => 'member',
        'email' => 'member@example.com',
        'password' => Hash::make('memberpass')
      ],
      [
        'name' => 'creator',
        'email' => 'creator@example.com',
        'password' => Hash::make('creatorpass')
      ]
    ]);
}

登録処理に使うメソッドはcreate,insert,saveなど、LaravelのDB登録に使うメソッドであればどれでも大丈夫です。

今回は配列にまとめて一括で登録できるinsertメソッドを使いましたが、created_atカラムとupdated_atカラムは入らないので注意してください。
以下の記事でも紹介していますので、気になる方は読んでみてください。
【Laravel】insertメソッドの注意点

DatabaseSeederに登録

UserSeederが作れたら、DatabaseSeederに登録します。

「database/seeders/DatabaseSeeder.php」を開き、以下のように編集します。

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        $this->call(UserSeeder::class);
    }
}

後ほど紹介するSeeder実行コマンドを実行すると、このDatabaseSeederに登録されているSeederのみが実行されます。逆にいうと、ここに登録されていないと実行されないので注意してください。

Seeder実行

最後に、以下のSeeder実行コマンドを実行します。

$ php artisan db:seed

これで、Seederが実行されます。

DBを確認してみましょう。

しっかりと3件分データ登録されていることが確認できました✨

おまけ

特定のSeederのみ実行する

Seedeを複数作成している場合、その中の一部のSeederのみ実行したい場合も出てくるかと思います。

このような場合は、以下のようにSeederクラスを指定して実行することができます。

$ php artisan db:seed --class=PostSeeder

この場合は、DatabaseSeederに登録する必要はありません。

一度DBをクリアしてからSeederを実行する

既にDBにデータが入ってしまっていて、一度クリアしてからSeederを実行したい場合は以下のコマンドで実現できます。

$ php artisan migrate:fresh --seed

Factoryを使ってデータ投入する

今回のSeederを使ったデータの準備方法では、insertメソッドを使って1件1件データを用意してデータ投入しました。ですが、これでも1件1件データを定義していくのは面倒ですよね。

そこで、Laravelにはダミーデータを簡単に作成できる機能があります。それが、Factoryクラスです。

Factoryクラスは主にテストなどで用いられるダミーデータ生成用のクラスですが、Seederでも活用することができます。

作成コマンドは以下のようになっています。

$ php artisan make:factory PostFactory

実行すると、「databases/factories/PostFactory.php」が作成されているはずです。

そして、ファイルを以下のように編集します。

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\User;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
 */
class PostFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        $user_id = User::where('email', 'admin@example.com')->first()->id;
        return [
            'user_id' => $user_id,
            'title' => fake()->word(),
            'body' => fake()->text()
        ];
    }
}

fake()メソッドはランダムなダミーデータを生成してくれます。

あとは、Seederに組み込むだけです。例えば、DatabaseSeederに以下のように記述します。

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

こうすると、10件分のユーザーのダミーデータが作成できます。

まとめ

本記事では、LaravelのSeederの基本や使い方などをみてきました。

Seederを使うことでデータを効率よく用意することができます。実際に開発の実務ではほぼ必ず使うことになるかと思うので、Laravelを使って開発を行う方は必須で身につけておきましょう。

また、本記事ではfactoryについて少し触れましたが、まだまだ奥が深い機能です。こちらはまた別の記事でもっと詳しく解説していきたいと思います。

それでは、ご清聴ありがとうございました!

参考


PHPフレームワークLaravel入門第2版 [ 掌田津耶乃 ]

コメント

タイトルとURLをコピーしました