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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:24:00