我在使用Codeigniter 2.1构建的网站上遇到搜索功能时遇到问题。具体来说,我遇到了分页问题,每页限制为15个项目。
我的控制器:
public function program_search()
{
if ($this->input->post('term')){
$this->front->set('title', 'Search Results');
$this->front->set('res' , $this->wc_search->search($this->input->post('term')));
$this->load->library('pagination');
$config['base_url'] = base_url().'/site/program_search_results/';
$this->db->where('JobRef',$this->input->post('term'));
$this->db->or_where('WorkType',$this->input->post('term'));
$this->db->or_where('Parish',$this->input->post('term'));
$this->db->or_where('Location',$this->input->post('term'));
$config['total_rows'] = $this->db->count_all_results('wc_program');
$config['per_page'] = 10;
$config['num_links'] = 20;
$config['full_tag_open'] = '<div id="pagination">';
$config['full_tag_close'] = '</div>';
$this->pagination->initialize($config);
$this->front->buffer('content', 'site/program_search_results');
$this->front->render();
}
else
{
$this->front->set('title', 'Program Search');
$this->front->buffer('content', 'site/program_search');
$this->front->render();
}
}
然后在我的模型中我有:
public function search($term)
{
$data = array();
$this->default_select();
$this->db->like('JobRef', $term);
$this->db->or_like('Area', $term);
$this->db->or_like('Parish', $term);
$this->db->or_like('WorkType', $term);
$this->db->or_like('Location', $term);
$this->default_order_by();
//$this->db->limit(15);
$q = $this->db->get('wc_program');
if ($q->num_rows() > 0)
{
foreach ($q->result_array() as $row)
{
$data[] = $row;
}
}
$q->free_result();
return $data;
}
如何根据此代码让分页工作?我真的不想改变已存在的代码,因为搜索工作正常。我只是需要它来显示每页搜索15个记录。
答案 0 :(得分:1)
让我们看看能否引导您解决问题:
希望有所帮助!
答案 1 :(得分:0)
通过你的per_page&amp; num_links进入search()来计算LIMIT&amp;您的查询的OFFSET
你需要做一些简单的数学计算偏移量
答案 2 :(得分:0)
正如David Graham所说,你错过了LIMIT和OFFSET。 CodeIgniter分页是相当基础的,因为底层的“ActiveRecord”本身非常基本(实质上是一个查询构建器,而不是ORM)。
因此,您需要考虑SQL级别,如何获得所需的“页面”结果。
下面是我的一个项目的示例代码。
<强>控制器:强>
// set up pagination
$itemsPerPage = 20;
$totalItems = $this->Location_model->count_locations( $locationName, $locationType, $locationParent );
// get itemStartIndex from URL if specified, otherwise default to 0
if ( $this->uri->segment(3) )
{
$itemStartIndex = $this->uri->segment(3);
}
else
{
$itemStartIndex = '0';
}
$this->load->library('pagination');
$config['base_url'] = site_url('admin/locations');
$config['total_rows'] = $totalItems;
$config['per_page'] = $itemsPerPage;
$config['uri_segment'] = 3;
// store offset in case user triggers a function and we want to come back to same page
$this->session->set_flashdata('pagination_offset', $itemStartIndex);
$this->pagination->initialize($config);
$data['pagination'] = $this->pagination->create_links();
// get current locations from database
$records = $this->Location_model->get_locations( $locationName, $locationType, $locationParent, $itemStartIndex, $itemsPerPage );
...
// now $records gets passed to view for display
<强> MODEL:强>
function count_locations($locationName = '', $locationType = '', $locationParent = '')
{
$this->db->select('id');
if ( $locationName != '' )
{
$this->db->like('name', $locationName);
}
if ( $locationType != '')
{
$this->db->where('location_type', $locationType);
}
if ( $locationParent != '')
{
$this->db->where('parent_id', $locationParent);
}
$query = $this->db->get('locations');
return $query->num_rows();
}
function get_locations($locationName = '', $locationType = '', $locationParent = '', $startIndex = '0', $limit = '')
{
$this->db->select('*');
if ( $locationName != '' )
{
$this->db->like('name', $locationName);
}
if ( $locationType != '')
{
$this->db->where('location_type', $locationType);
}
if ( $locationParent != '')
{
$this->db->where('parent_id', $locationParent);
}
$this->db->order_by('name', 'asc');
$query = $this->db->get('locations', $limit, $startIndex);
if ($query->num_rows() > 0)
{
return $query;
}
else
{
return FALSE;
}
}
请注意,我执行查询的方法有可选参数$ startIndex和$ limit。这些是用于分页工作的强制性。 URI段(在我的例子中,段3)将直接告诉控制器要使用的OFFSET,并且您指定的per_page
转换为LIMIT(在我的情况下,我使用$ itemsPerPage来存储,因为它是多次引用 - 实际上我在我的情况下使用全局值,但我在这里硬编码以便于参考。
请注意,您还需要一个计数方法。您可能只是使用相同的查询,加载所有结果,并在控制器中计数,但我喜欢使用一个单独的计数方法,只使用我的WHERE限制生成一个最小的查询,并选择只有COUNT('id'),其速度它大大增加了。 (当然缺点是它是DRY的反模式,因为必须定义两次相同的查询代码,一次用于计数方法,一次用于数据查询方法)
在您的代码上注明
不是在控制器中指定那些or_where语句,而是在描述搜索的方法下将它们放在模型中。这种搜索逻辑肯定应该在模型中 - 控制器应该只接受路由,将输入传递给模型,然后设置分页和查看结果。