Laravel迁移报错:加载Provider时提示setting表不存在
问题分析
执行php artisan migrate时触发SQL错误,提示setting表不存在,根源在于:Laravel执行控制台命令(如migrate)时会初始化整个应用,你的Provider的boot方法中加载了路由文件,而路由文件里的get_prefix(Page::class)调用会直接查询setting表,但此时该表还未通过迁移创建,导致报错。
解决方案
方案1:仅在非控制台环境加载路由
修改Provider的boot方法,添加判断逻辑,只在Web请求环境下加载路由,避免migrate时执行路由相关的查询:
public function boot() { // 仅当非控制台环境时加载路由 if (!$this->app->runningInConsole()) { $this->loadRoutesFrom(base_path('platform/packages/page/router/web.php')); } $this->loadViewsFrom(base_path('platform/packages/page/resources/views/'), 'admin.page'); $this->loadMigrationsFrom(base_path('platform/packages/page/database/migrations/')); $this->loadTranslationsFrom(base_path('platform/packages/page/resources/lang'), 'admin.page.lang'); }
方案2:给get_prefix函数增加表存在校验
修改get_prefix函数,先检查setting表是否存在,再执行查询逻辑,避免在表未创建时触发错误:
use Illuminate\Support\Facades\Schema; function get_prefix($modelClass) { // 先判断setting表是否已创建 if (!Schema::hasTable('setting')) { return false; // 或返回你的默认前缀值 } // 原有的前缀查询逻辑 return \DB::table('setting') ->where('key', /* 对应模型的配置key */) ->value('value'); }
方案3:延迟路由逻辑的执行
修改路由文件,将get_prefix的调用延迟到实际请求处理时,而不是路由加载阶段:
Route::get('/', [PublicController::class, 'index'])->name('public.home'); Route::get('/{slug}', function ($slug) { if (get_prefix(Page::class)) { return app(PublicController::class)->get($slug); } elseif (get_prefix(Post::class)) { return app(PostController::class)->get($slug); } abort(404); });
内容的提问来源于stack exchange,提问作者cannv
相关产品推荐
相关产品推荐

