Laravel项目运行需先完成数据库迁移和填充:①创建并编写迁移文件,用php artisan migrate执行;②外键失败需调整迁移顺序;③Seeder中禁用DB::insert,Laravel 10+须显式(new Seeder)->run();④开发环境用migrate:fresh --seed一键重置。

要让Laravel项目真正跑起来,数据库表必须先存在、数据必须填进去——表不存在,Seeder再怎么跑也插不进一条记录;表存在但外键顺序错乱,迁移直接中断;Laravel 10+ 之后调用Seeder的方式还变了,旧写法会静默失败。
确认并执行数据库迁移
第一步:检查 database/migrations/ 目录下是否有你创建的迁移文件,比如 2026_07_15_103000_create_users_table.php。没有就立刻补上:php artisan make:migration create_users_table --create=users。
第二步:打开该文件,在 up() 方法里写清字段定义,例如:$table->id(); $table->string('email')->unique(); $table->timestamps();。注意【别在 up() 里调用 DB::table()->insert() ——这是 Seeder 的活,混用会导致迁移失败且难以排查】。
第三步:运行 php artisan migrate。如果报错“Foreign key constraint fails”,说明外键依赖的表还没建,得按依赖顺序重排迁移文件名(时间戳越早越先执行)或合并到同一迁移中。
第四步:用 php artisan migrate:status 确认迁移状态。看到 “Ran” 标记才算成功。没标记?不是网络问题,是迁移根本没触发——检查 .env 中 DB_DATABASE 是否填对、MySQL 服务是否启动、用户权限是否足够。
编写并运行数据填充器
方法一:使用工厂批量生成(推荐用于测试数据)
执行 php artisan make:seeder UserSeeder → 编辑 database/seeders/UserSeeder.php,在 run() 方法中写 User::factory()->count(50)->create(); → 确保 app/Models/User.php 已定义 factory() 方法并关联了对应工厂类。
方法二:手动构造数组插入(适合初始化固定数据)
在 UserSeeder.php 的 run() 里写:DB::table('users')->insert([['name' => 'Admin', 'email' => 'admin@example.com', 'password' => bcrypt('123456')]]);。注意字段名必须和数据库列名完全一致,大小写敏感。
方法三:Laravel 10+ 必须显式 new 实例
打开 database/seeders/DatabaseSeeder.php,删掉旧写法 $this->call(UserSeeder::class),替换成:(new UserSeeder())->run();。这一步漏掉,db:seed 就像没按开关——命令返回成功,表却空着。
一键重置并填充(开发环境专用)
第一步:停掉所有正在读写数据库的进程,避免 truncate 被锁表。
第二步:执行 php artisan migrate:fresh --seed。这个命令会先删掉所有表,再重新 migrate,最后自动触发 db:seed。
第三步:若需清空后保留表结构只删数据,改用 php artisan db:seed --force,但必须提前在 UserSeeder 或 DatabaseSeeder 开头加 DB::table('users')->truncate();。有外键时,得套一层:DB::statement('SET FOREIGN_KEY_CHECKS=0'); DB::table('users')->truncate(); DB::statement('SET FOREIGN_KEY_CHECKS=1');。
第四步:批量插入超 500 条时,绝不用循环 User::create()。改用 DB::table('users')->insert($batchData),其中 $batchData 是二维关联数组,每项键名严格对应字段名。否则内存爆满、请求超时、部分数据丢失,全算在 Seeder 头上。











