【Laravel】 シーダーでレコードを自動で挿入
特にアプリの開発時は、データベースを初期化したり、データを置いたりを繰り返します。本番環境でも、新機能を用意した際にデータを入れるなどといったこともしばしばあります。しかし、毎回手動でデータを用意するのでしょうか。Laravelでは、シーディングすると自動でデータを入れることができます。
seedは、種子という意味です。seedingは、種を蒔くということになります。
シーディングする
シーディングするには、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のクラスを作成せずとも全部DatabaseSeeder
のrun
に直書きしても問題ありません。とはいえ、大概は分けたほうが良いくらいには量が増えます。
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; // ... }
まとめ
シーダーを用いることで、自動でデータを入れることができます。開発環境用のダミーデータだけでなく、本番環境に必要なデータもシーダーを使用して導入できます。
シーダーを使ってデータを楽に挿入できるようにしておきましょう。
