【Laravel】データベースシーディングで初期データを自動登録する方法

【Laravel】データベースシーディングで初期データを自動登録する方法 Laravel

Laravelでは、開発やテストの効率化のために、データベースに初期データを自動的に挿入できる「シーディング(Seeding)」という仕組みが用意されています。本記事では、Seederの基本からFactoryとの連携、実行方法までを網羅的に解説します。

シーディングとは何か?

シーディングとは、テーブルに初期データを投入する処理のことです。LaravelではDatabaseSeederクラスと、それに紐づく個別のSeederクラスを使って、任意のデータを登録することができます。開発環境やステージング環境で、あらかじめ用意したテストデータを素早く投入できるため、効率的な開発に欠かせない機能です。

Seederクラスの作成

LaravelでSeederクラスを作成するには、以下のArtisanコマンドを使用します。

php artisan make:seeder UsersTableSeeder

このコマンドでdatabase/seeders/UsersTableSeeder.phpというファイルが生成されます。

中身は以下のように記述します。

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'テストユーザー',
            'email' => 'test@example.com',
            'password' => Hash::make('password'),
        ]);
    }
}

この例では、usersテーブルに1件のデータを直接挿入しています。

DatabaseSeederでの呼び出し

作成したSeederを実行対象にするには、DatabaseSeeder.phpファイルに追記します。

public function run()
{
    $this->call([
        UsersTableSeeder::class,
    ]);
}

この状態で以下のコマンドを実行すれば、Seederに記述された処理が実行されます。

php artisan db:seed

複数のSeederをまとめて実行する

$this->call()メソッドには複数のSeederクラスを配列で指定することができます。

$this->call([
    UsersTableSeeder::class,
    PostsTableSeeder::class,
    CategoriesTableSeeder::class,
]);

このように記述すれば、関連するテーブルへの初期データをまとめて登録できます。

Factoryと連携した大量データの投入

Laravelでは「Factory」と「Faker」ライブラリを使って、ランダムなダミーデータを簡単に生成できます。

まずFactoryファイルを作成します。

php artisan make:factory UserFactory --model=User

作成されたdatabase/factories/UserFactory.phpに、以下のようなダミーデータ定義を記述します。

use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;

public function definition()
{
    return [
        'name' => $this->faker->name(),
        'email' => $this->faker->unique()->safeEmail(),
        'password' => Hash::make('password'),
        'remember_token' => Str::random(10),
    ];
}

SeederでFactoryを呼び出すには、以下のように記述します。

public function run()
{
    \App\Models\User::factory()->count(10)->create();
}

これにより、10件のランダムなユーザーデータが生成されます。

シーディングの再実行方法と注意点

すでにシーディングを実行済みの場合、再投入の前にテーブルのデータをリセットしたいケースもあります。その場合は、以下のコマンドを使います。

php artisan migrate:refresh --seed

このコマンドはマイグレーションを初期化し、シーディングまで一括で実行します。開発中によく使われる便利なコマンドです。

ただし、実行時にはデータベースが初期化されるため、本番環境での使用は避けてください。

本番環境での利用時の注意

シーディングは基本的に開発やテスト用の仕組みですが、本番環境で必要な初期データ(例:管理者ユーザーや設定項目)を登録する目的で使うこともあります。その場合は、–classオプションを使って、特定のSeederだけを実行するようにしましょう。

php artisan db:seed --class=AdminUserSeeder

また、シーディング処理には破壊的な操作(truncateなど)を含めないよう十分に注意してください。

まとめ

LaravelのSeeder機能を活用すれば、初期データの登録作業が大幅に効率化されます。Factoryと組み合わせることで、リアルなダミーデータも手軽に生成でき、開発やテストの精度向上にもつながります。目的に応じて適切に使い分けながら、堅牢なアプリケーション構築に役立てましょう。