シーディング(最初のデータを入れる)
開発用や最初に必要なデータを、データベースへまとめて入れるシーダーの書き方と、db:seed コマンドでの動かし方を説明します。
シーディングは、データベースに最初のデータ(ためしのユーザーや、はじめから必要な設定など)を、プログラムでまとめて入れることです。お店を開く前に、棚に商品を並べておく作業のようなものです。Laravel では、データを入れるためのクラス(シーダー)を書いて、コマンドで動かします。
シーダーのクラスは、すべて database/seeders に置きます。最初から DatabaseSeeder というクラスが用意されていて、その中で call メソッドを使うと、ほかのシーダーを動かせます。動かす順番も、自分で決められます。
補足
シーディングの間は、マスアサインメント(一括代入)の保護が自動で止まります。
シーダーを書く#
シーダーを作るには、make:seeder という Artisan コマンド(php artisan で動かす Laravel のコマンド)を使います。作られたシーダーは、database/seeders に置かれます。
php artisan make:seeder UserSeeder
シーダーのクラスには、最初は run というメソッドが1つだけあります。db:seed コマンドを動かすと、この run が呼ばれます。run の中では、好きなやり方でデータベースにデータを入れられます。クエリビルダで自分で入れることも、ファクトリ(ためしのデータを自動で作るしくみ)を使うこともできます。
例として、最初からある DatabaseSeeder を書き換えて、run にデータを入れる処理を足してみます。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* Run the database seeders.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
補足
run メソッドの引数には、必要な部品を型で書いておけます。Laravel のサービスコンテナ(クラスを作って渡してくれる道具箱)が、自動で用意して渡してくれます。
ファクトリを使う#
1つずつ、モデルのデータを手で書くのは大変です。ファクトリを使えば、たくさんのデータを、かんたんに作れます。ファクトリの作り方は、先にファクトリのページで確かめてください。
たとえば、それぞれ記事を1つ持つユーザーを、50人作る例です。
use App\Models\User;
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
ほかのシーダーを呼ぶ#
DatabaseSeeder の中では、call で、ほかのシーダーを動かせます。1つのシーダーが大きくなりすぎないように、ファイルを分けられます。call には、動かすシーダーのクラスの配列を渡します。
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
モデルのイベントを止める#
シーディングの間は、モデルからイベント(「起きた」という知らせ)が出ないようにしたいことがあります。WithoutModelEvents トレイト(クラスに機能を足す部品)を使います。これを使うと、call で別のシーダーを動かしても、モデルのイベントは出ません。
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}
シーダーを動かす#
データベースにデータを入れるには、db:seed コマンドを動かします。既定では、Database\Seeders\DatabaseSeeder を動かし、そこから、ほかのシーダーが呼ばれます。1つのシーダーだけを動かしたいときは、--class で、クラスを決めます。
php artisan db:seed
php artisan db:seed --class=UserSeeder
migrate:fresh に --seed を付けても、データを入れられます。migrate:fresh は、全部の表を消して、マイグレーションを全部動かし直すので、データベースを丸ごと作り直したいときに便利です。--seeder で、動かすシーダーを決められます。
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder
| コマンドやオプション | 働き |
|---|---|
db:seed |
DatabaseSeeder を動かす |
db:seed --class=UserSeeder |
決めたシーダーだけを動かす |
migrate:fresh --seed |
表を作り直してから、シーダーを動かす |
--seeder=UserSeeder |
migrate:fresh --seed で動かすシーダーを決める |
--force |
本番でも確認なしで動かす |
本番で無理やり動かす#
シーディングには、データを変えたり、消したりするものがあります。本番のデータベースで、うっかり動かさないように、production 環境では、動かす前に確認を聞かれます。確認なしで動かすには、--force を付けます。
php artisan db:seed --force
関連するページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。