必须手动在DatabaseSeeder的run()方法中调用$this->call(UserSeeder::class)才能执行UserSeeder;推荐用Eloquent Factory生成数据,需显式定义非空字段,可用--class参数指定单个Seeder运行。

直接用 php artisan db:seed 跑不起来,大概率是没跑过 php artisan migrate,或者 DatabaseSeeder 里没调用你写的 Seeder 类。
如何创建并注册一个 Seeder 类
Laravel 不会自动发现新写的 Seeder,必须手动注册到 DatabaseSeeder 的 run() 方法里。否则 db:seed 命令只会执行空逻辑。
- 运行
php artisan make:seeder UserSeeder生成类文件,位于database/seeders/UserSeeder.php - 编辑
database/seeders/DatabaseSeeder.php,在run()方法中加入:$this->call(UserSeeder::class);
- 确保
UserSeeder类的run()方法里有实际操作,比如User::factory()->count(10)->create();
使用工厂(Factory)还是手动 new Model?
推荐优先用 Eloquent Factory,它能自动处理字段约束、关联关系和随机数据生成;手动 new User 容易漏掉非空字段或触发模型事件异常。
- 工厂需配合
php artisan make:factory UserFactory --model=User创建 - 若数据库字段有
NOT NULL但工厂没定义,默认值为null,会导致插入失败,错误信息类似:SQLSTATE[HY000]: General error: 1364 Field 'email' doesn't have a default value
- 工厂中可显式覆盖字段:
return [ 'name' => $this->faker->name, 'email' => $this->faker->unique()->safeEmail, ];
只运行某个 Seeder 而不是全部
避免每次重跑全部填充数据,尤其是开发中反复调试单个表时。
- 用
--class参数指定类名:php artisan db:seed --class=UserSeeder
- 类名必须带完整命名空间,如果项目启用了自定义命名空间(如
Database\Seeders),要写全:php artisan db:seed --class=Database\\Seeders\\UserSeeder
- 注意 Windows 命令行中反斜杠要双写,Linux/macOS 可用单斜杠或引号包裹
Seeder 执行没有事务包装(除非你自己加),一旦中途出错,可能留下脏数据;线上环境严禁直接运行 db:seed,本地开发也建议先用 --dry-run 模拟(Laravel 10+ 支持)或先备份数据库。










