Laravel 8+ 应使用 User::factory()->count(50)->create() 替代废弃的 factory(User::class, 50)->create();假数据不入库用 $this->faker->email,入库且需模型逻辑必须用 Model::factory()。

Seeder 里用 factory() 还是 fake()?
Laravel 8+ 已废弃 factory() 全局函数,直接调用会报 Call to undefined function factory()。现在必须用模型的静态方法 User::factory() 或 Faker 实例 $this->faker->name。
- 旧写法(Laravel 7 及以前):
factory(User::class, 50)->create()→ 现在无效 - 新写法(Laravel 8+):
User::factory()->count(50)->create() - 如果只需要假数据不入库,用
$this->faker->email;要入库且走模型事件/类型转换,必须走Model::factory() -
Model::factory()默认调用Database\Factories\UserFactory,没生成过工厂类就先跑php artisan make:factory UserFactory
批量插入卡住或超时?关掉模型事件和批量优化
默认 Model::factory()->count(1000)->create() 是逐条 INSERT,还触发 creating/created 等事件,1000 条可能耗时数秒甚至超时。
- 关事件:加
->withoutEvents(),如User::factory()->count(1000)->withoutEvents()->create() - 强制批量:用
DB::table('users')->insert($data)手动拼数组,跳过 Eloquent,快 5–10 倍 - 但注意:手动
insert不走模型的$casts、$dates、mutators,时间字段得自己转成Y-m-d H:i:s - PHP 内存限制也得看,插 10000 条建议分块,比如每次 500:
for ($i = 0; $i count(500)->create(); }
Seeder 依赖其他表数据,怎么控制执行顺序?
运行 php artisan db:seed 时,所有 Seeder 默认按文件名升序执行,不是按类名或注释。名字乱了就会报 Integrity constraint violation: 1452(外键失败)。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 命名必须带数字前缀,例如:
01_create_users_table_seeder.php、02_create_posts_table_seeder.php - 不要依赖
$this->call(AnotherSeeder::class)来“保证顺序”——它只是同步调用,不改变全局执行列表,且嵌套太深易栈溢出 - 外键约束可在 Seeder 开头临时关闭:
DB::statement('SET FOREIGN_KEY_CHECKS=0');,末尾再开回来,但仅限开发环境,生产慎用 - 更稳妥的做法:在 PostSeeder 里用
User::inRandomOrder()->first()拿用户 ID,而不是硬写user_id => 1
本地跑得通,CI 或线上跑 seed 报错:找不到工厂类或 faker 方法不存在
常见于 Laravel 版本升级后未更新 composer.json 的 autoloader,或 CI 环境没装 laravel/sail / fakerphp/faker 的 dev 依赖。
- 检查
composer show fakerphp/faker是否存在;Laravel 9+ 要求^1.21,旧版 faker 不支持$this->faker->unique()等新方法 - 工厂类路径错误:Laravel 默认找
Database\Factories\UserFactory,但如果自定义了命名空间或路径,要在User模型里重写public static function factory()方法返回对应实例 - 运行前先清 autoload:
composer dump-autoload,尤其改过工厂类名或移动过文件位置之后 - CI 中用
--no-interaction --force参数避免交互卡住,例如:php artisan db:seed --class=UserSeeder --no-interaction --force
真正麻烦的不是写几行 create(),而是外键链路一长,某个中间表少插一条,后面全崩;还有 faker 生成的邮箱重复撞了唯一索引,却只报 SQL 错误不提示哪条数据冲突——这些得靠日志打点或小批量试跑才能揪出来。










