laravel 10 与 11 的 seeder 调用顺序和依赖关系配置完全一致:均需用 new userseeder()->run() 显式调用,不支持 $this->call();执行顺序由代码调用先后决定,无自动依赖解析;必须先 migrate 再 seed,且中文 faker 需指定 'zh_cn' locale。

Laravel 10 和 11 在数据库填充(Seeder)的调用顺序与依赖关系配置上**基本一致,没有实质性变更**。官方文档与实际运行行为均表明:Laravel 11 延续了 Laravel 10 引入的核心机制,未重构 Seeder 的调度逻辑,重点优化的是底层兼容性与开发体验,而非执行模型本身。
Seeder 调用方式完全统一:new 实例化 + run() 显式调用
自 Laravel 10 起,$this->call() 已被正式弃用,Laravel 11 完全延续该设计:
- 必须使用
(new UserSeeder())->run()形式调用子 Seeder - 不能传字符串类名(如
$this->call('UserSeeder'))或UserSeeder::class - 需提前
use Database\Seeders\UserSeeder;,否则类加载失败且静默跳过 - DatabaseSeeder 的
run()方法仅作调度入口,不建议直接写插入逻辑
执行顺序仍由开发者显式控制,无自动依赖解析
两个版本都不支持基于外键或表关系的自动拓扑排序。顺序完全取决于你在 DatabaseSeeder::run() 中的调用先后:
- 先调用
(new RoleSeeder())->run(),再调用(new UserSeeder())->run(),才能避免外键约束报错 - 若 User 表依赖 roles.id,而 RoleSeeder 未先执行,插入会失败(MySQL 报错 1452)或静默中断(取决于 PDO 设置)
- 无注解、无配置文件、无 @depends 机制 —— 顺序即代码顺序
迁移与填充的协同流程未变:必须先 migrate,再 seed
这一点在 10 和 11 中严格保持一致,且是数据能写入的前提:
- Seeder 不创建表,也不检查表是否存在;表不存在时
DB::table('users')->insert()会静默失败(Laravel 9+ 默认关闭异常抛出) - 推荐组合命令仍是:
php artisan migrate:fresh --seed(清库 → 建表 → 填充),适用于开发环境重置 -
php artisan db:seed默认只运行DatabaseSeeder,不会自动触发未被显式调用的子 Seeder
中文 Faker 与字段映射细节同样适用
无论 10 还是 11,fake() 行为一致,易错点相同:
- 中文项目必须显式指定 locale:
fake('zh_CN')->name(),否则可能返回空或英文 - 插入字段名须与数据库列名完全一致(如表字段是
user_name,就不能用name) -
fake()->unique()->email()在大批量插入时仍可能触发Maximum retries of unique generator reached,需加try/catch或改用其他策略











