[Laravel]Seederを使ってデータを投入する

Seederファイルを作成

コマンドを使用してSeederファイルを作成します。

php artisan make:seeder ResetUserSeeder

「ResetUserSeeder」の部分は、クラス名やファイル名となるため、どんなSeederであるかが判断できるような名前を適宜付けておくと良いと思います。

ファイル作成後は、runメソッドの中にレコード操作の処理を記述します。
DBファサードやModelクラスを使用して、レコード作成の処理を行いましょう。
データの入れ替えを目的とする場合は、truncateなどを併用すると良いと思います。

コーディング例

<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class ResetUserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        //
        User::truncate();
        
        User::create([
            'login_id' => 'admin',
            'email' => 'admin@admin.co.jp',
            'password' => 'admin',
        ]);
    }
}

Seederの実行

コマンドを実行してSeederの実行を行います。

php artisan db:seed --class ResetUserSeeder

「ResetUserSeeder」の部分は作成したSeederに合わせて変更してください。

複数のクラスに分けたSeederを1コマンドで実行する

開発の際はSeederが複数のクラスに分けられて作成されることがほとんどだと思います。
しかし、初回データ投入の際などにすべてのクラスを指定してコマンドを実行するのは非常にめんどくさい大変ですね。
もちろん、実行漏れなどのリスクも伴います。

データ投入の際に、複数のSeederを実行したい場合はSeederから別のSeederを実行することで実健出来ます。

例えば、

php artisan db:seed

とクラスを指定せずにコマンドを実行すると、database/seeders/DatabaseSeeder.phpが実行されます。
クラスの指定をせずに実行ができるので、初回データ投入などでもよくつかわれるクラスですね。
ここから、別のSeederを呼び出して実行することで初回データ投入時のコマンド実行を1つにまとめることができます。

その際はDatabaseSeederのrunメソッドに以下のように記述します。

$this->call(ResetUserSeeder::class);

コード全体はこんな感じになりますね。

<?php

namespace Database\Seeders;

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

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