You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:00:56