
Laravel 默认只扫描 database/migrations 根目录下的迁移文件,若将迁移放入子文件夹则不会自动识别;需通过服务提供者显式注册额外路径,才能使 php artisan migrate 正常发现并执行这些迁移。
laravel 默认只扫描 `database/migrations` 根目录下的迁移文件,若将迁移放入子文件夹则不会自动识别;需通过服务提供者显式注册额外路径,才能使 `php artisan migrate` 正常发现并执行这些迁移。
Laravel 的 migrate 命令默认仅加载 database/migrations/ 目录下的一级 .php 文件(即不递归扫描子目录)。当你使用 --path 参数创建迁移到子文件夹(如 database/migrations/tenant/)时,该文件虽被成功生成,但 Laravel 启动时并未将其纳入迁移查找路径,因此 migrate 和 migrate:status 均无法感知,始终显示 “Nothing to migrate”。
✅ 正确解决方案:在服务提供者中注册自定义迁移路径
推荐在 AppServiceProvider 的 boot() 方法中调用 loadMigrationsFrom(),传入绝对路径数组(支持多个路径):
// app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\App;
public function boot()
{
// 支持单个或多个自定义迁移目录
$this->loadMigrationsFrom([
database_path('migrations/tenant'),
database_path('migrations/feature-a'),
database_path('migrations/shared'),
]);
}⚠️ 注意事项:
- ✅ 路径必须为绝对路径,务必使用
database_path()辅助函数生成,避免硬编码; - ✅
loadMigrationsFrom()应在boot()中调用(而非register()),确保容器已就绪; - ❌ 不要手动调用
app()->make('migrator')->path(...)—— 虽然可行,但会提前实例化 migrator,违背 Laravel 的延迟加载原则,且不支持多路径; - ? 所有注册路径中的迁移文件将与默认路径统一排序执行(按时间戳前缀升序),无需额外干预;
- ? 修改后需清除配置缓存(如已启用):
php artisan config:clear(开发环境通常无需,但部署后建议执行)。
✅ 验证是否生效:
运行 php artisan migrate:status,新路径下的迁移应出现在列表中(状态为 Pending);随后执行 php artisan migrate 即可正常执行。
? 小贴士:对于多租户、模块化或领域驱动(DDD)项目,可结合目录命名规范(如 2023_01_01_000000_create_tenant_users_table.php)和分组路径管理,提升迁移的可维护性与上下文清晰度。


















