假设我们有这样的一个日志表,记录了各个事件反生时的时间戳:
CREATE TABLE `logs`(
`timestamp` BIGINT,
`event` varchar(50)
)
如果我们要在页面上分页显示出这些事件,假设我们要用ci框架的active_record类实现分页,可能的代码如下:
//根据条件过滤
$this->db->select('*')->from('log')
->where('timestamp>=', $args['begintime'])
->where('timestamp<=', $args['endtime']);
$this->db->limit($args['limit'], $args['start']);
$rs = $this->db->get()->result_array();
//过滤后的总的记录数
$this->db->select('*')->from('log')
->where('timestamp>=', $args['begintime'])
->where('timestamp<=', $args['endtime']);
$cnt = $this->db->count_all_results();
可以看到,条件过滤的代码写了两次,而且获取总的记录数时,还不能过滤limit,如果条件过滤很长,那冗余的代码就多了,你可能会想到写一个方法,将这些条件过滤的代码放进去,的确,这样也是可行的,不过这里还有一个技巧,请看:
//根据条件过滤
$this->db->start_cache();
$this->db->select('*')->from('log')
->where('timestamp>=', $args['begintime'])
->where('timestamp<=', $args['endtime']);
$this->db->limit($args['limit'], $args['start']);
$rs = $this->db->get()->result_array();
$cnt = $this->db->count_all_results();
$this->db->flush_cache();
只要使用active_record的缓存sql即可,方便省事,而且巧在它还不会缓存limit,哈哈