如何将CI3查询缓存升级到CI4并复用CodeIgniter4 Active Record
CI4 复用查询条件统计总行数实现方案
CI4 已移除 CI3 中原有的 start_cache()/stop_cache()/flush_cache() 系列查询缓存方法,可通过以下两种方式实现相同的条件复用需求:
方案1:查询构造器克隆(完全对齐原有CI3逻辑,适合需要先获取全量匹配数据的场景)
// 构建基础查询条件,对应原CI3的缓存段逻辑 $baseBuilder = $this->db->table('<<items_table>>') ->select('<<some_items>>') ->where('<<condition>>') ->groupBy('<<group_by_condition>>') ->orderBy('<<order_by_condition>>'); // 克隆基础查询对象统计总行数,不会修改原对象的查询条件 $total = (clone $baseBuilder)->get()->getNumRows(); // 原基础查询对象追加limit条件后取分页数据 $listQuery = $baseBuilder->limit(10, 10)->get(); $data = $listQuery->getResultArray(); $total_per_limit = $listQuery->getNumRows();
方案2:高性能统计(推荐分页场景使用,无需拉取全量数据,性能提升明显)
// 基础查询条件构建逻辑同上 $baseBuilder = $this->db->table('<<items_table>>') ->select('<<some_items>>') ->where('<<condition>>') ->groupBy('<<group_by_condition>>') ->orderBy('<<order_by_condition>>'); // 统计总行数,传false参数不会重置已构建的查询条件 $total = $baseBuilder->countAllResults(false); // 直接追加limit条件取分页数据 $listQuery = $baseBuilder->limit(10, 10)->get(); $data = $listQuery->getResultArray(); $total_per_limit = $listQuery->getNumRows();
注意事项
- CI4 所有查询构造器、结果集方法已统一改为驼峰命名,原CI3的蛇形命名方法不再支持,注意对应修改
- 若你的查询中存在
having等特殊条件,优先使用克隆方案避免统计异常
内容的提问来源于stack exchange,提问作者IWannaBeMeMeMe
相关产品推荐
相关产品推荐

