CodeIgniter框架下合并多状态MySQL计数查询的实现方案
CodeIgniter 合并多状态统计查询实现方案
需求说明
基于MySQL + CodeIgniter 框架开发,crm_listings 表的 status 字段有3个取值:D(草稿)、N(未发布)、Y(已发布)。原有方案为每个状态单独写查询方法,性能较低,需要合并为一个方法一次性返回各状态在指定时间范围内的记录计数。
改造步骤
1. 模型层替换统一查询方法
删除原有三个独立的查询方法,新增如下聚合查询方法,直接在数据库层面完成计数,性能更高,同时使用CodeIgniter查询构造器自动转义参数,避免SQL注入风险:
public function get_status_count($st_date, $end_date) { $this->db->select('status, COUNT(*) as count'); $this->db->from('crm_listings'); // 拆分条件写法,框架自动处理参数转义 $this->db->where('CAST(added_date AS DATE) >=', $st_date); $this->db->where('CAST(added_date AS DATE) <=', $end_date); $this->db->group_by('status'); $query = $this->db->get(); // 初始化默认值,避免某类状态无数据时返回空 $res = [ 'D' => 0, // 草稿计数 'N' => 0, // 未发布计数 'Y' => 0 // 已发布计数 ]; foreach ($query->result() as $row) { $res[$row->status] = $row->count; } return $res; }
2. 控制器层简化调用逻辑
删除原有三次模型调用的代码,替换为单次调用,渲染表格逻辑同步调整:
// 仅需调用一次模型即可获取所有状态计数 $counts = $this->user_model->get_status_count($startDate, $endDate); $output .= ' <div class="table-responsive"> <table class="table table-bordered table-striped"> <tr> <th>Draft</th> <th>Unpublish</th> <th>Publish</th> </tr> '; // 统计总数判断是否有数据 if(array_sum($counts) > 0) { $output .= ' <tr> <td>'.$counts['D'].'</td> <td>'.$counts['N'].'</td> <td>'.$counts['Y'].'</td> </tr> '; } else { $output .= '<tr> <td colspan="3">No Data Found</td> </tr>'; } $output .= '</table>'; echo $output;
3. 视图层逻辑不变
原有AJAX请求代码不需要任何修改,可以直接复用。
内容的提问来源于stack exchange,提问作者JJM50
相关产品推荐
相关产品推荐

