laravel seeder 填充测试数据需三步:写类(php artisan make:seeder)、注册(databaseseeder 中 call)、运行(db:seed);推荐 db::table()->insert 批量插入或模型工厂 create(),禁用于生产环境。

在 Laravel 项目中用 Seeder 填充测试数据,核心是“写类→注册→运行”三步,专为开发和测试环境设计,不用于生产初始化。
创建 Seeder 类
用 Artisan 命令生成一个新 Seeder:
-
php artisan make:seeder UserSeeder —— 自动生成
database/seeders/UserSeeder.php - 文件默认继承
Illuminate\Database\Seeder,包含空的run()方法 - 确保类名与文件名完全一致(如
UserSeeder↔UserSeeder.php),否则调用会静默失败
在 run() 中插入数据
推荐两种高效方式,避免循环 save() 或 create():
-
直接批量插入(最快):
DB::table('users')->insert($data),$data是二维数组,不触发模型事件、验证,适合 1000+ 条 -
用模型工厂(最灵活):先运行
php artisan make:factory UserFactory --model=User,在工厂中定义definition(),然后在 Seeder 中写User::factory()->count(50)->create() - 记得手动设置时间戳(如
'created_at' => now()),或开启模型的$timestamps = true
注册并执行 Seeder
Seeder 不会自动运行,必须显式调用:
- 在
database/seeders/DatabaseSeeder.php的run()方法里添加:$this->call(UserSeeder::class); - 运行全部已注册的 Seeder:
php artisan db:seed - 只运行某一个:
php artisan db:seed --class=UserSeeder - 重置数据库并填充(开发常用):
php artisan migrate:fresh --seed(先删表重建结构,再跑 Seeder)
注意事项和避坑点
Seeder 是开发工具,不是部署脚本:
-
不自动清表:
--force参数只是允许重复运行,不会 truncate 表——要清空得自己加DB::table('users')->truncate() -
不处理外键约束:多个 Seeder 有依赖关系(如先插用户再插文章),需在
DatabaseSeeder中按顺序$this->call() -
别混用 Migration:建表归 Migration,插数据归 Seeder;Migration 的
up()里不要写insert(),否则破坏职责分离 -
生产环境禁用:CI/CD 或线上部署时通常只执行
migrate,Seeder 仅限本地、Docker 开发或测试环境











