CodeIgniter中对比数据表后添加无重复缺失数据的实现方法
我来帮你搞定这个问题!首先咱们得明确核心需求:把enroll表里存在但mark表里没有的学生(结合提交的考试、班级、学段ID)批量插入到mark表,还要保证绝对不重复。你之前的代码只获取了表单参数,还没处理关键的“对比差异+插入”逻辑,这就是出错的原因啦。
下面给你一套适配CodeIgniter的完整解决方案,分Controller和Model两部分实现:
第一步:Controller里处理请求与参数校验
public function sync_students_to_mark() { // 获取提交的核心参数,先做基础校验 $exam_id = $this->input->post('exam_id'); $class_id = $this->input->post('class_id'); $section_id = $this->input->post('section_id'); if (empty($exam_id) || empty($class_id) || empty($section_id)) { $this->session->set_flashdata('error', '请填写完整的考试、班级、学段信息!'); redirect('your_controller/your_target_page'); return; } // 调用Model获取需要插入的缺失学生 $missing_students = $this->mark_model->get_unmarked_students($exam_id, $class_id, $section_id); if (!empty($missing_students)) { // 批量插入到mark表 $insert_status = $this->mark_model->batch_add_students($missing_students); $msg = $insert_status ? "成功添加 ".count($missing_students)." 名学生!" : "添加失败,请重试!"; $this->session->set_flashdata($insert_status ? 'success' : 'error', $msg); } else { $this->session->set_flashdata('info', '所有学生已在mark表中,无需添加!'); } redirect('your_controller/your_target_page'); }
第二步:Model里实现数据对比与批量插入
创建Mark_model.php(或者复用你已有的Model),添加以下两个方法:
/** * 获取enroll表存在、但当前考试/班级/学段下mark表缺失的学生 * @param int $exam_id 考试ID * @param int $class_id 班级ID * @param int $section_id 学段ID * @return array 待插入的学生数据数组 */ public function get_unmarked_students($exam_id, $class_id, $section_id) { // 这里假设用student_name作为学生唯一标识,建议换成student_id(更精准,避免重名) $this->db->select('enroll.student_name'); $this->db->from('enroll'); // 排除mark表中已存在的同考试/班级/学段的学生 $this->db->where_not_in('enroll.student_name', function($sub_query) use ($exam_id, $class_id, $section_id) { $sub_query->select('student_name'); $sub_query->from('mark'); $sub_query->where('exam_id', $exam_id); $sub_query->where('class_id', $class_id); $sub_query->where('section_id', $section_id); }); // 如果enroll表也关联了班级/学段,可加上筛选条件,只同步当前班级的学生 // $this->db->where('enroll.class_id', $class_id); // $this->db->where('enroll.section_id', $section_id); $query = $this->db->get(); $students = $query->result_array(); // 给每条学生数据添加上要插入的关联参数 foreach ($students as &$student) { $student['exam_id'] = $exam_id; $student['class_id'] = $class_id; $student['section_id'] = $section_id; // 如果mark表有默认字段(比如score默认0),可以在这里补充 // $student['score'] = 0; } return $students; } /** * 批量插入学生到mark表 * @param array $students_data 待插入的学生数组 * @return bool 插入结果 */ public function batch_add_students($students_data) { return $this->db->insert_batch('mark', $students_data); }
关键注意点
- 学生唯一标识:如果你的表中有
student_id字段,一定要把代码里的student_name替换成student_id——名字可能重复,用ID做唯一判断才是最可靠的。 - 批量插入优势:用CodeIgniter的
insert_batch比循环单条插入效率高得多,也能减少数据库连接开销。 - 场景适配:如果
mark表是按考试+班级存储学生成绩,子查询里的exam_id/class_id/section_id筛选一定要加上,避免误插入其他考试的学生记录。
内容的提问来源于stack exchange,提问作者AbuuJurayj Swabur Buruhan
相关产品推荐
相关产品推荐

