Laravel8升级后coa/find路由报SQLSTATE[22P02整数类型输入语法错误
问题解决方案
根本原因
你的错误本质是路由匹配顺序问题,和控制器逻辑完全无关:
- 你的路由文件中,
coa/find路由的前面存在coa/{id}格式的路由(大概率是 CoaController 的资源路由),Laravel 路由是从上到下匹配的,请求coa/find时会先命中coa/{id}路由,把字符串find当做 id 参数传入show方法,因此才会执行查id = find的 SQL,请求根本没有走到你写的findCoa方法里。 - Laravel 8 默认取消了路由服务提供者的全局命名空间前缀,你用的字符串格式
'Setting\CoaController@findCoa'写法本身也存在兼容性问题,你没报控制器不存在的错误,反而报 SQL 错误,也实锤了请求被前面的路由拦截的判断。
解决方案
- 调整路由顺序:把固定路径的路由放到带参数的路由、资源路由前面,示例如下:
// 固定路径路由放最前面 Route::get('/coa/find', [\App\Http\Controllers\Setting\CoaController::class, 'findCoa']); // 再放资源路由/带参数的路由 Route::resource('coa', \App\Http\Controllers\Setting\CoaController::class);
- 统一路由写法:Laravel 8 推荐用数组形式定义路由,你 Laravel 7 原有的数组写法完全兼容,不需要改成字符串
@格式的写法,避免命名空间不匹配的问题。 - 验证:修改完成后执行
php artisan route:list查看路由列表,确认coa/find路由对应的控制器方法为findCoa,且排序在coa/{id}路由之前即可。
内容的提问来源于stack exchange,提问作者bandungeuy
相关产品推荐
相关产品推荐

