【问题标题】:how to avoid duplicate entry in Laravel如何避免在 Laravel 中重复输入
【发布时间】:2021-07-27 05:37:05
【问题描述】:

我想为每个学生在不同年级(10 年级、11 年级、12 年级)的多个科目打分现在我选择每个学生 ID,我可以为每个学生存储分数,但我想避免每个年级和科目的重复输入. 例如,如果我在 10 年级的数学科目中给出 50 分,同样如果我想在 10 年级的数学科目中加分,系统不应接受并抛出重复输入的消息。 注意:我使用的是 Laravel 7

这是我的 MarkController 存储方法:

公共函数存储(请求 $request) {

    $this->validate($request, [

        'subject_id' => 'integer',
        'grade_id' => 'required',
        'final_marks' => 'required',

    ]);
    $getMarks = Mark::where('student_id',$request->student_id)->first();
         if($getMarks->subject_id != $request->subject_id ){
             if($getMarks->grade_id != $request->grade_id){
                 $marks = new Mark();
        $marks->student_id = request('student_id');
        $marks->subject_id = $request->subject_id;
        $marks->grade_id = $request->grade_id;
        $marks->final_marks = $request->final_marks;
        //dd('New Marks added');
        $marks->save();
             }

         }else{
             dd('duplicate entry');
         }
    return back()->with('marks-created-message', 'Marks added');
} 

这是我的分数表

public function up()
{
    Schema::create('marks', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('student_id');
        $table->unsignedInteger('subject_id');
        $table->unsignedTinyInteger('grade_id');
        $table->double('final_marks',8,2);
        $table->timestamps();
    });


    Schema::table('marks', function(Blueprint $table){
        $table->foreign('student_id')->references('id')->on('students');
        $table->foreign('subject_id')->references('id')->on('subjects');
        $table->foreign('grade_id')->references('id')->on('grades');

    });

【问题讨论】:

  • 所以您希望grade_idfinal_marks 需要唯一?
  • @Espresso 我需要 subject_id 和grade_id 在输入后是唯一的。第二次它不应该允许输入相同科目和年级的分数。
  • 那你需要再定义一个自定义规则

标签: laravel eloquent duplicates laravel-7 laravel-validation


【解决方案1】:

我通过在 MarkController 中添加这个逻辑解决了这个问题,它起作用了:

公共函数存储(请求 $request) {

    $this->validate($request, [

        'subject_id' => 'integer',
        'grade_id' => 'required',
        'final_marks' => 'required',

    ]);
    $studentId = $request->student_id;
    $subjectId= $request->subject_id;
    $gradeId= $request->grade_id;
    $sub = 0; // declare variable
    $std =0; // declare variable
    $grd =0; // declare variable


    // Searching Record in DB
    $marks = DB::table('marks')->where('student_id', $studentId)->where('subject_id', $subjectId)
        ->where('grade_id', $gradeId)->get();
    //checking if record exist in DB
    if($marks) {
        foreach ($marks as $mark) {
            $sub = $mark->subject_id; // assigning vale to variable
            $std = $mark->student_id; // assigning vale to variable
            $grd = $mark->grade_id; // assigning vale to variable
        }
    }
    if ($sub == $subjectId and $std == $studentId and $grd == $gradeId){
        session()->flash('marks-duplicate-message','Marks already exist.');
     //   return redirect()->route('marks.store',compact('std'));
        return back();
    }else{
        $marks = Mark::create([
            'student_id' => $request->student_id,
            'subject_id' => $request->subject_id,
            'grade_id' => $request->grade_id,
            'final_marks' => $request->final_marks,
        ]);
        session()->flash('marks-created-message','Marks added.');
        return back();

    }

}

【讨论】:

    【解决方案2】:

    从代码中,subject 应该是唯一唯一的列,因为您无法在没有主题的情况下分配成绩。 所以验证规则应该是这样的:

    $this->validate($request, [ 
        'subject_id' => 'integer|unique:marks', 
        'grade_id' => 'required', 
        'final_marks' => 'required', 
    ]);
    

    然后,如果您需要自定义消息来重复输入,那么您的验证应该如下所示

    $this->validate($request, [ 
        'subject_id' => 'integer|unique:marks', 
        'grade_id' => 'required', 
        'final_marks' => 'required', 
    ],[
       'subject_id.unique' => 'Duplicate are not allowed',
    ]);
    

    您可以获取更多信息:Form-request-validation

    【讨论】:

      猜你喜欢
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 2012-07-15
      相关资源
      最近更新 更多