laravel 11 中需用 php artisan migrate 执行迁移、php artisan db:seed --force 运行种子,且必须显式启用或指定种子类;迁移定义结构变更,种子填充数据,依赖工厂与主 seeder 调用顺序。

在 Laravel 11 中迁移数据和填充种子数据,核心是使用 Artisan 命令配合数据库迁移文件(migrations)和种子类(seeders)。Laravel 11 默认启用了“模型工厂自动发现”和更严格的种子执行控制,不再默认运行 php artisan db:seed 而不加参数,需显式指定或启用允许。
创建并运行数据库迁移
迁移用于定义数据库结构变更。先生成迁移文件,再执行:
- 生成迁移:
php artisan make:migration create_users_table - 编辑生成的文件(位于
database/migrations/xxx_create_users_table.php),在up()方法中定义表结构,例如使用$table->string('name')等 - 运行迁移:
php artisan migrate(仅运行未执行过的迁移) - 若需重置并重跑:先
php artisan migrate:fresh(会删库重建,开发环境安全,生产慎用)
编写和注册数据填充器(Seeder)
Laravel 11 默认禁用无保护的批量种子操作,需手动启用或指定种子类:
- 生成 Seeder:
php artisan make:seeder UserSeeder - 在
database/seeders/UserSeeder.php的run()方法中插入数据,例如:User::factory()->count(50)->create(); - 若使用模型工厂,确保已定义对应工厂(
php artisan make:factory UserFactory --model=User) - 在主种子类
DatabaseSeeder.php中调用它:$this->call(UserSeeder::class);
运行种子数据填充
由于 Laravel 11 加强了安全限制,直接运行 db:seed 会提示“seeding is disabled”,需明确允许:
- 首次运行(含主种子):
php artisan db:seed --force - 只运行某个特定种子:
php artisan db:seed --class=UserSeeder --force - 重跑迁移并自动填充(开发常用):
php artisan migrate:fresh --seed --force - 如需跳过确认提示(CI/自动化场景),始终加上
--force
注意事项与调试技巧
避免常见陷阱,提升执行稳定性:
- 迁移文件名中的时间戳必须唯一,否则
migrate会跳过重复项;修改后可用php artisan migrate:refresh回滚并重放 - 种子数据执行顺序由
DatabaseSeeder@run()中的$this->call()顺序决定,注意外键依赖(如先 seed roles,再 seed users) - 工厂生成的数据默认不触发模型事件(如
creating),如需触发,加->recycle()或手动调用save() - 查看当前迁移状态:
php artisan migrate:status;列出已注册的 seeders:php artisan db:seed --list











