必须先执行迁移创建表再运行填充器,否则seeder静默失败;迁移需检查文件、定义字段并运行php artisan migrate;填充器可用工厂、原生sql或显式实例化;调试时用php artisan migrate:fresh --seed一键重置并填充。

要让 Laravel 项目数据库真正可用,必须先让表存在,再往里填数据——跳过迁移直接跑填充,表不存在,Seeder 就会静默失败,你看到的永远是空表。
先建表:执行数据库迁移
迁移文件本质是 PHP 脚本,它不自动运行,必须手动触发才能把代码变成真实表结构。
第一步:确认 migration 文件已生成且路径正确——检查 database/migrations/ 目录下是否有类似 2026_0801_120000_create_users_table.php 的文件;若没有,用 php artisan make:migration create_users_table --create=users 补上。
第二步:打开该文件,在 up() 方法中确保字段定义完整,比如至少包含 $table->id(); 和 $table->timestamps();;【外键字段必须在被引用表迁移之后执行,否则报错中断】。
第三步:运行 php artisan migrate。这会逐个执行未标记为“已运行”的迁移,每成功一条就在 migrations 表里记一笔。
验证是否成功?运行 php artisan migrate:status,看到所有迁移状态为 yes,且数据库中已出现对应数据表,才算真正完成建表。
再填数:运行数据填充器
Seeder 不建表、不改结构,只插数据——它假设表已经存在,且字段名、类型、约束都已就位。
方法一:使用模型工厂批量生成(推荐)
确保已创建模型工厂(如 database/factories/UserFactory.php),并在 definition() 中返回合法字段数组;然后在 Seeder 的 run() 方法里写:User::factory()->count(50)->create();。这会走 Eloquent 全流程,含验证和事件。
方法二:用原生 SQL 批量插入(高性能场景)
在 Seeder 中调用 DB::table('users')->insert($data);,其中 $data 是二维关联数组;【每条数据键名必须与数据库字段名完全一致,大小写敏感】。
方法三:Laravel 10+ 必须显式 new 实例
在 DatabaseSeeder.php 中,不能再写 $this->call(UserSeeder::class);必须改成:(new UserSeeder())->run();,否则整个填充过程会被跳过,表依然为空。
一键重置并填充
开发调试时最常用的组合命令:
php artisan migrate:fresh --seed
这条命令会先删掉所有表(执行全部 down()),再重建(全部 up()),最后自动运行 DatabaseSeeder;但注意:它不会清空 migrations 表,也不会重置主键自增起始值。
如果需要连主键计数也归零,得额外加 --force 并在 Seeder 开头手动 truncate:DB::table('users')->truncate();,有外键则需先关检查:DB::statement('SET FOREIGN_KEY_CHECKS=0');。











