Laravel 8手动删除所有数据表后执行迁移命令无法重建表报错如何解决?
报错信息:Base table or view not found: 1146 Table 'mymedia.categories' doesn't exist (SQL: select * from
categorieswherecategories.deleted_atis null order byidasc)
问题原因
这个报错本质不是迁移逻辑出错,是Laravel框架在初始化启动阶段就触发了categories表的查询操作,早于migrate系列命令的实际执行逻辑,所以不管执行什么迁移相关命令都会提前抛出找不到表的错误
解决方案
步骤1:定位提前查询的代码
排查以下位置是否存在直接查询categories表的逻辑:
- 所有服务提供者(尤其是
app/Providers/AppServiceProvider.php)的boot()方法,常见场景是给所有视图共享分类导航数据 - 全局中间件(
app/Http/Kernel.php中注册的全局中间件)内的查询逻辑 - 路由文件中的闭包路由、路由模型绑定逻辑
步骤2:临时屏蔽或优化查询逻辑
找到对应查询代码后,两种处理方式二选一:
- 临时注释掉这部分查询代码,等迁移执行完成后再恢复
- 给查询逻辑加控制台运行判断,避免执行artisan命令时触发:
// 仅非控制台运行时才执行查询逻辑 if (!app()->runningInConsole()) { // 原有的查询categories、共享视图等代码放在这里 view()->share('categories', \App\Models\Category::all()); }
步骤3:执行迁移重建表
清理缓存后执行迁移命令:
- 先清理所有缓存避免配置缓存触发异常:
php artisan config:clear && php artisan cache:clear && php artisan route:clear - 执行全量迁移重建所有表:
php artisan migrate:fresh
如果是生产环境需要加--force参数:php artisan migrate:fresh --force
步骤4:恢复代码
迁移执行成功后,如果你之前是临时注释了查询代码,恢复对应代码即可;如果已经加了runningInConsole判断,无需额外修改,后续再执行artisan命令也不会触发同类问题。
内容的提问来源于stack exchange,提问作者MicroWeb Technology Ltd
相关产品推荐
相关产品推荐

