【Laravel】 シーダーでレコードを自動で挿入

特にアプリの開発時は、データベースを初期化したり、データを置いたりを繰り返します。本番環境でも、新機能を用意した際にデータを入れるなどといったこともしばしばあります。しかし、毎回手動でデータを用意するのでしょうか。Laravelでは、シーディングすると自動でデータを入れることができます。

seedは、種子という意味です。seedingは、種を蒔くということになります。

シーディングする

シーディングするには、3つの手順が必要です。

  1. シーダーを作成
  2. 実装対象に登録
  3. 実行

早速シーディングして、データを自動で入れてみましょう。

シーダー作成

まずはクラスを作成します。

php artisan make:seeder UserSeeder

そうするとdatabase/seeders内にクラスが作成されます。

runメソッド内に、どのようなデータを入れるかを定義します。普段データベースに書き込むのと同じような感覚で書き込みます。

use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
// ...

public function run()
{
    DB::table('users')->insert([
        'name' => 'sample',
        'email' => 'hoge@example.com',
        'email_verified_at' => new Carbon(),
        'password' => Hash::make('Passw0rd!'),
    ]);
}

実行対象に登録

次に、database/seeders/DatabaseSeeder.phpに、$this->callを使ってどのseederを実行するかを設定します。

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

seederが少量であれば、seederのクラスを作成せずとも全部DatabaseSeederrunに直書きしても問題ありません。とはいえ、大概は分けたほうが良いくらいには量が増えます。

seederを実行

最後にseederを実行すると、データベースに書き込まれます。

# 全てのシーダを実行
php artisan db:seed

# 特定のシーダだけ実行
php artisan db:seed --class=UserSeeder

# データベースのレコードを全て削除して、シーダーを実行
php artisan migrate:fresh --seed

# productionでseederを実行するかのプロンプトで、強制的に実行する
php artisan db:seed --force

シーディングは、マイグレーションと違ってどれを実行したかの管理はありません。db:seedすると毎回全てのseederが実行されます

モデルイベントを実行しないようにする

データの保存時などに実行するモデルイベントがある場合、それを実行しないようにできます。WithoutModelEventsを使用するだけです。

use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    // ...
}

まとめ

シーダーを用いることで、自動でデータを入れることができます。開発環境用のダミーデータだけでなく、本番環境に必要なデータもシーダーを使用して導入できます。

シーダーを使ってデータを楽に挿入できるようにしておきましょう。

laravel seeder thumb

役に立ったらシェアしよう!