用 php artisan tinker 手动填充数据最省事:User::factory()->count(3)->create() 一行入库,注意需 use 模型、调 create() 而非 make()、确保工厂已注册、处理唯一性与时间字段精度、关联用 User::factory()、大数量时禁用事件或改用 DB::table 批量插入。

用 php artisan tinker 手动塞几条数据最省事
开发初期改模型字段、调接口逻辑,根本不需要整套填充器。直接进 tinker,App\Models\User::factory()->count(3)->create() 一行搞定,连文件都不用建。
常见错误是没加 ->create(),只调 ->make(),结果数据没进库还一脸懵;或者漏了 use App\Models\User;,报 Class 'User' not found。
-
->make()只生成内存对象,不写库;->create()才真正插入 - 模型没注册工厂(比如没在
Database\Factories下放对应工厂类),会报Factory for [App\Models\Xxx] is not defined - 如果模型启用了强制类型或非空约束(比如
$fillable漏了字段),create()会直接抛MassAssignmentException
写 UserFactory 时字段映射错位很常见
工厂里写 'email' => $this->faker->unique()->safeEmail 看着没问题,但一跑批量就可能因唯一性冲突报 Integrity constraint violation: 1062 Duplicate entry —— Faker 的 unique() 默认只缓存当前批次,跨批次不保证。
更隐蔽的问题是时间字段:用 $this->faker->dateTimeBetween('-1 year', 'now') 没问题,但若模型里 created_at 是 datetime 类型而数据库是 timestamp,MySQL 5.6+ 可能截断微秒导致入库失败。
- 批量插入前先清缓存:
$this->faker->unique(true)->safeEmail,true表示全局去重 - 时间字段优先用
now()或$this->faker->dateTimeThisYear(),避开时区和精度陷阱 - 关联字段别硬写 ID,用
'user_id' => User::factory()让 Laravel 自动处理外键生成
php artisan db:seed 不执行自定义 Seeder 的真实原因
运行命令后控制台安静得像没事儿发生,其实是因为 DatabaseSeeder 里没显式调用你的 UserSeeder。Laravel 6+ 默认的 DatabaseSeeder 是空的,不会自动扫描所有 Seeder 类。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
另一个高频坑:在 UserSeeder 里用了 DB::table('users')->insert(...) 手动插,结果软删除字段(deleted_at)为 null 被当成字符串插入,MySQL 报 Data truncated for column 'deleted_at'。
- 必须在
DatabaseSeeder::run()里手动添加:$this->call(UserSeeder::class) - 避免裸 SQL 插入,统一走模型工厂:
User::factory()->count(100)->create() - 如果真要用
DB::insert(),记得把deleted_at设为null(PHPnull,不是字符串"null")
大数量填充(>10k)卡死或内存溢出
直接 User::factory()->count(50000)->create() 很容易触发 PHP 内存限制,尤其开了 Eloquent 事件或模型观察者时,每条记录都触发 creating、created 回调,性能断崖下跌。
还有人用 chunkById() 分批查再改,结果发现填充本身是写操作,chunkById 是为读设计的,完全用错了方向。
- 关掉模型事件:
User::withoutEvents(fn() => User::factory()->count(50000)->create()) - 用原生查询绕过 Eloquent:
DB::table('users')->insert($data),提前组装好二维数组 - 分批提交别用
for循环累加,改用collect(range(1, 50000))->chunk(1000)控制单次事务大小
工厂类里的 $this->faker 不是全局实例,每次 new Factory 都是新对象,所以 unique() 缓存默认不跨实例生效;跨文件复用逻辑时,别指望在一个工厂里设了 unique,另一个工厂里自动继承。










