如何在CodeIgniter中用Active Record实现含COUNT(po_id)的统计查询?
转换后的CodeIgniter Active Record实现方案
嘿,这事儿不难,我帮你把这条原生SQL完美转换成CodeIgniter的Active Record写法,完全匹配你的统计需求,还符合框架的最佳实践:
CodeIgniter 3.x 版本写法
// 假设在你的Model类中编写这段代码 public function get_registration_stats() { // 选择需要的字段和统计值,第二个参数FALSE防止框架自动给函数加反引号 $this->db->select('position.po_name AS position, activity.ac_name AS activity, COUNT(register.po_id) AS regis', FALSE); // 关联activity表(INNER JOIN,默认就是INNER类型) $this->db->join('activity', 'register.ac_id = activity.ac_id'); // 关联position表 $this->db->join('position', 'register.po_id = position.po_id'); // 添加WHERE条件 $this->db->where('register.regis_status', 2); $this->db->where('activity.ac_id', 2); // 按指定字段分组 $this->db->group_by(array('register.ac_id', 'register.po_id')); // 执行查询,主表为register $query = $this->db->get('register'); // 返回结果集,根据需求选result()(对象数组)或result_array()(普通数组) return $query->result(); }
关键部分说明
select()方法的第二个参数FALSE必须加上,因为我们用到了COUNT()聚合函数,不加的话CodeIgniter会自动给函数名加上反引号,导致SQL语法错误。join()方法默认使用INNER JOIN,和你的原生SQL逻辑一致;如果需要其他关联类型(比如LEFT JOIN),可以传递第三个参数指定,比如$this->db->join('activity', 'register.ac_id = activity.ac_id', 'LEFT')。group_by()支持传递数组来指定多个分组字段,完美对应原生SQL的GROUP BY register.ac_id,register.po_id。
如果你用的是CodeIgniter 4.x
CI4改用了Query Builder语法,写法略有不同,给你参考:
// 在CI4的Model中 public function get_registration_stats() { $builder = $this->db->table('register'); $builder->select('position.po_name AS position, activity.ac_name AS activity, COUNT(register.po_id) AS regis', FALSE) ->join('activity', 'register.ac_id = activity.ac_id') ->join('position', 'register.po_id = position.po_id') ->where('register.regis_status', 2) ->where('activity.ac_id', 2) ->groupBy(['register.ac_id', 'register.po_id']); return $builder->get()->getResult(); }
内容的提问来源于stack exchange,提问作者Book
相关产品推荐
相关产品推荐

