如何修复各科室医生数量统计始终显示为0的问题?
科室医生数量统计始终为0的排查与解决
一、数据层面排查
检查
doctor表的department_id字段值:
虽然你添加了department_id外键字段,但如果旧数据未更新、新医生记录未正确关联科室ID,统计结果必然为0。执行以下SQL验证:SELECT COUNT(*) FROM doctor WHERE department_id = [你的科室ID];如果结果为0,说明该科室下的医生记录未正确设置
department_id。需要批量更新旧数据(比如根据原department字段匹配科室表的id),同时确保新增医生时正确填充department_id。注意引擎限制:
你的表使用MyISAM引擎,该引擎不支持外键约束,即使添加了外键规则也不会生效,可能导致department_id被填入无效值(如不存在的科室ID或NULL)。建议将表引擎改为InnoDB,并重新添加外键约束:ALTER TABLE department ENGINE=InnoDB; ALTER TABLE doctor ENGINE=InnoDB;
二、模型函数修复
当前模型函数存在两个问题:无医生时会报错、多次查询效率低。修改如下:
public function getDoctorsCountByDepartment($department_id) { $this->db->select('COUNT(*) as doctor_count'); $this->db->from('doctor'); $this->db->where('department_id', $department_id); $query = $this->db->get(); // 处理无结果的情况,避免报错并返回0 $row = $query->row(); return $row ? (int)$row->doctor_count : 0; }
更高效的批量统计方案(推荐)
避免循环调用查询,一次性统计所有科室的医生数,减少数据库交互:
public function getAllDepartmentsWithDoctorCount() { $this->db->select('d.id, d.name, d.description, COUNT(doc.id) as doctor_count'); $this->db->from('department d'); $this->db->join('doctor doc', 'd.id = doc.department_id', 'LEFT'); $this->db->group_by('d.id'); return $this->db->get()->result(); }
控制器中直接调用这个方法即可,无需循环:
public function showDepartmentsWithDoctorCount() { $this->load->model('department_model'); // 直接获取带统计的科室数据 $data['departments'] = $this->department_model->getAllDepartmentsWithDoctorCount(); $this->load->view('department_view', $data); }
三、视图代码清理
视图中存在一段冗余且无效的代码,直接删除即可:
$doctors_count_by_department=array(); foreach ($doctors_count_by_department as $count) { if ($count->department == $department->id) { $doctor_count = $count->doctor_count; break; } }
这段代码定义了空数组并循环,完全不会影响结果,删除后不影响统计值展示。
四、控制器方法名优化
控制器中的方法名getDoctorsCountByDepartment与模型方法名重复,容易混淆,建议改为更清晰的名称(如上面的showDepartmentsWithDoctorCount),避免命名冲突。
内容的提问来源于stack exchange,提问作者Oli
相关产品推荐
相关产品推荐

