我正在尝试将学生信息与表单中的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进行此自定义验证,以使同一名学生无法再次参加同一门课程?
答案 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],
如果确实需要,可以将其隐藏在自定义规则后面。