制定自定义错误验证规则

时间:2018-07-23 05:00:09

标签: php laravel

我正在尝试将学生信息与表单中的id, name存储在数据库course_1, course_2中。 同一位学生无法再次注册同一门课程。

Students Table
id name
 1  X
 2  Y
Courses Table
 id course_name
 1   A
 2   B

Student_courses Table
 student_id courses_id
  1          1
  2          1
  2          2

像这样的学生控制器:

public function studentRegistration(Request $request)
{
  $student = new Student();
  $student->name = $request->Input(['student_name']);
  $student->save(); 

   $courses = array(
            $request->Input(['course_1']),
            $request->Input(['course_2']), 
            $request->Input(['course_3'])
        );

   foreach ($courses as $course) 
        {
           $studentCourse = new StudentCourse();
           $studentCourse->student_id = $student->id;
           $studentCourse->course_id = $course;
           $studentCourse->save();
        }
}

如何使用Laravel进行此自定义验证,以使同一名学生无法再次参加同一门课程?

2 个答案:

答案 0 :(得分:0)

使用different

'course_1' => ['different:course_2', 'different:course_3'],
'course_2' => ['different:course_1', 'different:course_3'],
'course_3' => ['different:course_1', 'different:course_2'],

更好的方法可能是将课程ID作为数组发送并使用distinct

'course_ids' => 'distinct'

例如,给定一个具有多个用于课程选择的输入的表单:

// Enter desired course ids. Could use select, checkbox, etc elements instead.

First Course: <input type="number" name="course_ids[]" value="">
Second Course: <input type="number" name="course_ids[]" value="">
Third Course: <input type="number" name="course_ids[]" value="">

以上使用distinct的规则将确保不提交重复的ID。

答案 1 :(得分:0)

您可以使用现有规则吗?

验证规则:

'course_1' => 'different:course_2,course_3|...',
'course_2' => 'different:course_3|...',

我不确定该示例的实际问题有多精确。如果这些字段的动态性强于此,那么自定义规则就有意义。

仅用于验证输入是否是这些字段的唯一值。要检查数据库,可以使用unique规则:

'course_1' => [..., $uniqueRule = Rule::unique('student_courses', 'course_id')->where('student_id', $whoEverTheStudentToCheckAgainstIs)],
'course_2' => [..., $uniqueRule],
'course_3' => [$uniqueRule],

如果确实需要,可以将其隐藏在自定义规则后面。