Laravel添加统计数据报SQLSTATE[23000] player_id不可为空错误
问题根因
player_id为空触发数据库非空约束报错,核心问题出在3处:
- GET请求的
addstats路由没有定义player_id参数,打开添加统计页时传递到视图的$player_id为空,表单隐藏域的对应值为空 - 提交校验规则没有增加
player_id的校验,空值提交到数据库层才触发报错 - 编辑统计的方法存在字段映射错误,会导致数据存储异常
修复步骤
1. 修改路由,给GET的addstats增加必填player_id参数
将路由文件中原来的addstats GET路由修改为:
Route::get('/addstats/{player_id}', [StatsController::class, 'addstats'])->name('addstats');
要求所有访问添加统计页的请求必须携带球员ID参数,避免参数丢失。
2. 调整StatsController的addstats方法
修改逻辑为从路由直接获取player_id,同时增加player_id的校验规则:
// 方法接收路由传递的player_id参数 public function addstats($player_id){ if($this->request->method() == 'POST'){ $alert = request() -> validate([ 'player_id' => 'required|exists:players,id', // 增加player_id校验,确保对应球员存在 'points' => 'required|numeric', 'average_points' => 'required|numeric', 'games' => 'required|numeric', 'duration' => 'required|numeric' ]); $stats = Stats::create($alert); if($stats){ return redirect('stats/'.$player_id)->with('success', '添加成功'); } } // 直接使用路由传入的player_id,避免参数被篡改 return view('addstats', ['player_id' => $player_id]); }
3. 修改addstats.blade.php的隐藏域字段名
和校验规则对应,将隐藏域的name属性从id改为player_id:
<input type="hidden" name="player_id" value="{{$player_id}}">
4. 修复editstats方法的字段映射错误
原编辑方法错误把统计字段赋值给了球员属性,修改为:
public function editstats(Stats $stats){ if($this->request->method() == 'POST'){ $alert = request() -> validate([ 'points' => 'required|numeric', 'average_points' => 'required|numeric', 'games' => 'required|numeric', 'duration' => 'required|numeric' ]); $stats->points = $this->request->get('points'); $stats->average_points = $this->request->get('average_points'); $stats->games = $this->request->get('games'); $stats->duration = $this->request->get('duration'); if($stats -> save()){ return redirect('stats/'); } } return view('editstats', ['stats' => $stats]); }
补充注意事项
所有跳转至添加统计页面的入口,都需要传递正确的球员ID参数,示例跳转代码:
<a href="{{ route('addstats', ['player_id' => $player->id]) }}">添加该球员统计数据</a>
内容的提问来源于stack exchange,提问作者Agim Gjini
相关产品推荐
相关产品推荐

