我在我的控制器中有一个分页页面,我有点困惑在我的视图中每页列出2个数据。我使用的控制器代码如下:
public function newsletter()
{
$this->load->library('pagination');
$config = array();
$config["base_url"] = base_url() . "index.php/welcome/newsletter";
$this->load->model('newsletter_model');
$total_row = $this->newsletter_model->record_count();
$config["total_rows"] = $total_row;
$config["per_page"] = 2; // per page 2 records
$config['use_page_numbers'] = TRUE;
$config['num_links'] = $total_row;
$config['cur_tag_open'] = ' <a class="current">';
$config['cur_tag_close'] = '</a>';
$config['page_query_string'] = FALSE;
$config['next_link'] = 'Next';
$config['prev_link'] = 'Previous';
$this->pagination->initialize($config);
if($this->uri->segment(3)){
$page = ($this->uri->segment(3)) ;
}
else{
$page = 1;
}
$this->load->model('newsletter_model');
$data["results"] = $this->newsletter_model->fetch_data($config["per_page"], $page);
$str_links = $this->pagination->create_links();
$data["links"] = explode(' ',$str_links );
$this->load->model('newsletter_model');
$this->load->view('newsletter/newsletter',$data);
}
使用上面的代码我按照预期每页获得2条记录,但我无法理解分页背后的逻辑。任何人都可以解释我在codeigniter pagination
中使用的逻辑,我的工作本身就像我理解它一样方便。
我的模型代码如下:
public function fetch_data($limit, $id)
{
$this->db->select('*');
$this->db->from('ins_newsletter');
$this->db->order_by('nl_id', 'desc');
$this->db->limit($limit,$id);
$query = $this->db->get();
return $query->result_array();
}
public function record_count()
{
return $this->db->count_all("ins_newsletter");
}
答案 0 :(得分:2)
CI的Paginator类只为您生成分页链接。
“记录分页”逻辑在这里发生:
$this->db->limit($limit, $offset);
$limit
是要获取的记录数,$offset
是要返回的第一行的偏移量。
要获取前两个记录,我们会设置$limit
= 2,$offset
= 0
CI转换为SQL,如:
SELECT ...... FROM ins_newsletter LIMIT 0, 2;
要获取3号和4号记录,我们会设置$limit
= 2,$offset
= 2
CI转换为SQL,如:
SELECT ...... FROM ins_newsletter LIMIT 2, 2;
修改强>
您的代码中存在一个小错误。
第1页的偏移量应为0,第2页为2,第3页为4,第4页为6,第5页为8 ......依此类推。
public function fetch_data($limit, $page)
{
$offset = ($page - 1) * $limit;
...
}
我建议你将第二个参数更改为$page
而不是$id
。