运行 php artisan db:seed 需显式指定填充器(如 --class=UserSeeder)或在 DatabaseSeeder::run() 中调用,否则因默认为空而无效;填充前须确保模型 $fillable 正确、数据库字段匹配且环境受控。

怎么运行 php artisan db:seed 才真正生效
不加参数直接运行 php artisan db:seed 默认只执行 DatabaseSeeder,而它默认是空的——所以你什么也看不到。必须手动在 DatabaseSeeder 的 run() 方法里调用具体 seeder,或者用 --class 指定。
- 想跑某个特定填充器:运行
php artisan db:seed --class=UserSeeder - 想重跑全部(清空再填):先
php artisan migrate:fresh,再php artisan db:seed(注意:这会删库) - 开发时更安全的做法是配合
--force和环境判断,避免在生产误触发
为什么 factory()->count(5)->create() 有时不生成数据
常见原因是模型没配置好 $fillable 或用了严格模式但字段缺失。Laravel 8+ 默认关闭了 mass assignment 保护,但如果你手动关了 protected $guarded = [] 却漏写字段,或数据库字段类型和 factory 返回值不匹配(比如给 INT 字段塞了字符串),create() 就会静默失败或抛异常。
- 检查模型的
$fillable是否包含你要填充的字段,例如['name', 'email'] - 用
factory(User::class)->make()先试生成内存对象,确认字段和类型没问题 - MySQL 严格模式下,
NOT NULL字段没默认值又没在 factory 里定义 → 直接报错SQLSTATE[HY000]: General error: 1364 Field doesn't have a default value
如何让填充器只在本地/测试环境运行
填充数据不是迁移,Laravel 不自动做环境隔离。如果误在生产跑 db:seed,轻则脏数据,重则覆盖关键记录。得靠代码逻辑拦截,不能依赖命令行开关。
- 在 seeder 类开头加判断:
if (! app()->environment('local', 'testing')) { return; } - 不要依赖
APP_ENV=production就万事大吉——有些部署流程会把 .env 里的APP_ENV设成local但实际是预发环境 - 更稳妥的是结合配置项,比如定义
'allow_seeding' => env('ALLOW_SEEDING', false),再在 seeder 里检查
php artisan make:seeder 生成的类为什么找不到表
新生成的 seeder 文件默认不含命名空间声明,也不引入模型。如果你在 database/seeders 下新建了子目录(比如 database/seeders/Users/UserSeeder.php),但没更新 DatabaseSeeder.php 中的 use 路径,就会报 Class "UserSeeder" not found;或者模型路径写错,导致 DB::table('users') 看似能跑,但关联关系、事件监听全失效。
- 确保文件顶部有正确命名空间:
namespace Database\Seeders\Users; - 在
DatabaseSeeder.php中用完整命名空间调用:(new Users\UserSeeder)->run(); - 别图省事全用
DB::table(),它绕过模型逻辑,软删除、观察者、类型转换全失效
复杂点在于:填充不是“一次写完就完事”的操作,它和模型定义、数据库状态、环境配置三者强耦合。漏掉任何一个环节,都可能表面成功、实际没数据,或者数据错位。尤其多人协作时,Seeder 类的加载路径和执行顺序最容易被忽略。











