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

Laravel作业模块异常:如何确保作业仅关联提交用户并正确显示状态

Laravel作业提交模块Bug排查与修复:单个用户提交导致所有同作业用户状态变更

问题核心

当单个学生提交作业时,同一作业下所有学生的作业状态都被更新为Submitted,而非仅更新提交作业的学生记录。这是典型的数据库更新未做用户身份限定导致的批量更新错误。

错误根源分析

你的AssignmentStudentController提交逻辑大概率仅通过assignment_id筛选记录,未加入当前登录用户的student_id条件,导致执行了批量更新操作。错误代码示例如下:

// 错误示例:无用户ID限定,更新该作业下所有学生记录
AssignmentStudent::where('assignment_id', $request->assignment_id)
    ->update(['status' => 'Submitted', 'file_path' => $filePath]);

修复方案

1. 修正Controller提交逻辑

更新作业记录时,必须加入当前登录用户的ID作为筛选条件,确保只更新当前用户的作业记录:

use Carbon\Carbon;

public function submitAssignment(Request $request)
{
    // 基础数据验证
    $request->validate([
        'assignment_id' => 'required|exists:assignments,id',
        'file' => 'required|file|mimes:pdf,doc,docx|max:2048',
    ]);

    // 获取当前登录的学生用户
    $currentStudent = auth()->user();

    // 文件存储逻辑(可根据实际存储配置调整)
    $filePath = $request->file('file')->store('student_assignments', 'public');

    // 精准定位当前用户的作业记录并更新
    $studentAssignment = AssignmentStudent::where('assignment_id', $request->assignment_id)
        ->where('student_id', $currentStudent->id) // 关键:添加用户ID限定
        ->firstOrFail(); // 若记录不存在则抛出404

    $studentAssignment->update([
        'status' => 'Submitted',
        'file_path' => $filePath,
        'submitted_at' => Carbon::now()
    ]);

    return back()->with('success', '作业提交成功');
}

2. 视图层强化安全校验

在提交表单中,建议同时传递assignment_student_id(作业与学生的关联记录ID),而非仅传assignment_id,进一步避免逻辑漏洞:

<form action="{{ route('assignments.student.submit') }}" method="POST" enctype="multipart/form-data">
    @csrf
    <!-- 隐藏字段:作业与学生的关联ID -->
    <input type="hidden" name="assignment_student_id" value="{{ $assignmentStudent->id }}">
    
    <div class="mb-3">
        <label class="form-label">作业文件</label>
        <input type="file" name="file" class="form-control" required>
    </div>

    <button type="submit" class="btn btn-primary">提交作业</button>
</form>

对应Controller可简化为:

use Carbon\Carbon;

public function submitAssignment(Request $request)
{
    $request->validate([
        'assignment_student_id' => 'required|exists:assignment_students,id',
        'file' => 'required|file|mimes:pdf,doc,docx|max:2048',
    ]);

    $currentStudentId = auth()->id();
    $studentAssignment = AssignmentStudent::findOrFail($request->assignment_student_id);

    // 额外权限校验:确保当前用户有权操作该记录
    if ($studentAssignment->student_id !== $currentStudentId) {
        abort(403, '无权操作此作业');
    }

    $filePath = $request->file('file')->store('student_assignments', 'public');
    $studentAssignment->update([
        'status' => 'Submitted',
        'file_path' => $filePath,
        'submitted_at' => Carbon::now()
    ]);

    return back()->with('success', '作业提交成功');
}

3. 数据库层面添加唯一约束

为assignment_students表添加assignment_id与student_id的联合唯一索引,避免同一学生同一作业出现多条记录,保证数据完整性:

ALTER TABLE assignment_students 
ADD CONSTRAINT unique_assignment_student 
UNIQUE (assignment_id, student_id);

验证步骤

  1. 用户1提交作业后,查看assignment_students表,确认仅用户1对应该作业的记录状态为Submitted
  2. 切换到用户2账号,查看该作业状态仍为Waiting,且无提交文件记录
  3. 重复提交测试,确保不会再出现批量更新的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:10:18