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

Laravel AJAX无法更新Timer模型,仅能新增记录求助

Laravel AJAX 计时器更新失败问题排查与修复

问题根源

你的代码存在两处关键参数不匹配问题,导致控制器无法正确定位已有的Timer记录,进而无法执行更新逻辑:

  1. AJAX传递参数名与控制器接收名不符:AJAX传的是task_id,但控制器用$request->job_id查询数据库的job_id字段,导致查询条件无效,永远找不到已存在的记录
  2. 未定义变量传递错误:AJAX中传递了未声明的running变量,而控制器需要的是status参数,导致更新分支的条件判断完全失效

修正后的代码

控制器代码(优化响应方式,保持查询逻辑)

public function timerUpdate(Request $request) {
    $timer = Timer::where('job_id', $request->job_id)
                  ->where('user_id', auth()->user()->id)
                  ->first();

    if ($timer) {
        $updateData = [];
        if ($request->status == '0') {
            $updateData['stopped'] = now(); // 用Laravel内置now()替代new Carbon更简洁
        } elseif ($request->status == '1') {
            $updateData['stopped'] = null;
        }
        $timer->update($updateData);
    } else {
        Timer::create([
            'user_id' => auth()->user()->id,
            'job_id' => $request->job_id,
            'started' => now(),
            'status' => $request->status, // 新增时同步存入status,保证数据一致性
        ]);
    }

    return response()->json(['statusCode' => 200]); // 用Laravel原生json响应更规范
}

AJAX代码(修正参数名与变量错误)

<script type='text/javascript'>
var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');

$(document).ready(function() {
    $('.toggle-class').change(function() {
        var status = $(this).prop('checked') ? 1 : 0;
        var job_id = $(this).data('id'); // 将原task_id改为job_id,匹配控制器接收参数

        $.ajax({
            url: '{{ route('timerUpdate') }}',
            type: 'post',
            data: {
                _token: CSRF_TOKEN,
                job_id: job_id,
                status: status // 修正为正确的参数名,使用已定义的status变量
            },
            success: function(data){
                $('#message').fadeIn();
                $('#message').text('Timer Updated Successfully');
                setTimeout(() => $('#message').fadeOut(), 3000);
            },
            error: function(xhr){
                // 新增错误处理,方便调试问题
                $('#message').fadeIn();
                $('#message').text('Update Failed: ' + xhr.responseText);
                setTimeout(() => $('#message').fadeOut(), 3000);
            }
        });
    });
});
</script>

额外优化建议

  • 给timers表的job_id和user_id添加联合唯一索引,避免重复创建记录
  • 在控制器开头添加请求参数验证,防止非法请求:
    $request->validate([
        'job_id' => 'required|exists:jobs,id',
        'status' => 'required|in:0,1',
    ]);
    
  • 使用Laravel的updateOrCreate方法简化逻辑,替代手动判断:
    Timer::updateOrCreate(
        ['job_id' => $request->job_id, 'user_id' => auth()->user()->id],
        [
            'started' => now(),
            'stopped' => $request->status == 0 ? now() : null,
            'status' => $request->status
        ]
    );
    

内容的提问来源于stack exchange,提问作者scully09

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:20:34