seeder 不自动运行,需手动指定类或在 databaseseeder 中调用;批量插入优先用 insert() 而非 create();生产环境必须加环境判断;faker 需显式设 zh_cn locale;seeder 仅用于有结构后的数据填充,非迁移替代。

Seeder 生成后不自动运行 php artisan db:seed
生成的 Seeder 类只是模板,Laravel 不会自动把它加进执行队列。你得手动告诉它“这次要跑哪个”。常见错误是只运行了 php artisan db:seed 却没指定类,结果什么都没发生——因为默认只跑 DatabaseSeeder,而它默认是空的。
- 如果刚建好一个
UserSeeder,得显式调用:php artisan db:seed --class=UserSeeder - 想让
DatabaseSeeder每次都包含它?在它的run()方法里加:$this->call(UserSeeder::class) - 注意大小写和命名空间:类名必须完全匹配文件名,且
--class参数值不带.php后缀
批量插入时用 insert() 而不是循环 create()
用 create() 逐条写入 1000 条用户,会触发 1000 次数据库查询 + Eloquent 事件 + 属性转换,慢且容易超内存。Seeder 是一次性初始化场景,没必要走完整模型生命周期。
- 能用
DB::table('users')->insert($data)就别用User::create() -
$data是二维数组,每项字段名必须和数据库列一致,不经过模型的$fillable或访问器 - 如果必须走模型逻辑(比如密码加密、UUID 生成),再用
create(),但记得用DB::transaction()包裹,避免中途失败留脏数据
开发环境误跑生产 Seeder 导致数据污染
Seeder 默认没有环境隔离,php artisan db:seed 在线上服务器执行,可能清掉真实订单或用户。Laravel 不拦你,它只管执行。
- 在 Seeder 类顶部加环境判断:
if (app()->environment('production')) { throw new Exception('Seeding disabled in production'); } - 更稳妥的是把敏感 Seeder 放进
--class显式调用,不放进DatabaseSeeder的call()链里 - 所有修改数据的 Seeder(尤其是带
truncate()或delete()的),第一行先写注释:// DANGEROUS: drops and repopulates users table
factory() 和 Faker 中文支持要手动配
默认 Faker 是英文 locale,生成的姓名、地址、公司名全是英文,填测试数据时很出戏。Laravel 8+ 的 factory() 函数已废弃,新写法依赖 Faker\Generator 实例。
- 在
DatabaseSeeder的run()开头加:$faker = \Faker\Factory::create('zh_CN'); - 然后用
$faker->name、$faker->address就是中文内容 - 如果用模型工厂(
php artisan make:factory UserFactory),在工厂类的definition()里也得自己传zh_CN,不能依赖全局配置










