2010-04-30 63 views
4

我使用codeigniter和分頁類。這是一個基本的問題,但我需要確保我不會錯過任何東西。爲了獲得必要的配置項目以將結果分頁到MySQL數據庫中,基本上有必要兩次運行查詢是否正確?Codeigniter分頁:運行查詢兩次?

換句話說,在分頁之前,您必須運行查詢來確定總記錄數。所以我做喜歡:

執行此查詢,得到的結果

$this->db->where('something', $something); 
$query = $this->db->get('the_table_name'); 
$num_rows = $query->num_rows(); 

的號碼,然後我會再做一次獲得與限制和抵消的結果。喜歡的東西:

$this->db->where('something', $something); 
$this->db->limit($limit, $offset); 
$query = $this->db->get('the_table_name'); 
if($query->num_rows()){ 

    foreach($query->result_array() as $row){ 

     ## get the results here 
    } 
} 

我只是想知道,如果我實際上做的這項權利查詢總是需要被運行兩次?我使用的查詢比上面顯示的要複雜得多。

回答

1

不幸的是,爲了分頁,你必須知道你有多少元素分解成頁面。

如果元素的計算過於昂貴,則可以隨時緩存結果中的元素總數。

1

是的,你必須運行兩個查詢,但$this->db->count_all('table_name');是一個&線更乾淨。

+0

還需要顯著少開銷比抓住整個記錄集 – 2012-01-03 08:41:24

0

分頁需要讀取一個記錄集兩次:

  1. 一旦讀取整個集,以便它可以計算總記錄數
  2. 然後讀取的記錄窗口中顯示

這是我用於項目的一個例子。在「旗幟」表有橫幅的名單,我想顯示分頁屏幕上:

  • 使用公共類屬性來存儲記錄總數(公共$ total_records)
  • 使用專用功能建立查詢(這對兩個活動都是通用的)。我們傳遞給這個函數的參數($ isCount)減少了查詢生成的數據量,因爲對於行數我們只需要一個字段,但是當我們讀取數據窗口時,我們需要所有必需的字段。
  • get_list()函數首先調用數據庫來查找總數並將其存儲在$ total_records中,然後讀取一個數據窗口以返回給調用者。
  • 記住,如果不先調用get_list()方法,我們將無法訪問$ total_records!

class Banner_model extends CI_Model { 

public $total_records; //holds total records for get_list() 

public function get_list($count = 10, $start = 0) { 
    $this->build_query(); 
    $query = $this->db->get(); 
    $result = $query->result(); 
    $this->total_records = count($result); //store the count 

    $this->build_query(); 
    $this->db->limit($count, $start); 
    $query = $this->db->get(); 
    $result = $query->result(); 

    return $result; 
} 

private function build_query($isCount = FALSE) { 
    $this->db->select('*, b.id as banner_id, b.status as banner_status'); 
    if ($isCount) { 
     $this->db->select('b.id'); 
    } 
    $this->db->from('banner b'); 
    $this->db->join('company c', 'c.id = b.company_id'); 
    $this->db->order_by("b.id", "desc"); //latest ones first 
} 

而且現在從控制器,我們稱之爲:

$data['banner_list'] = $this->banner_model->get_list(); 
$config['total_rows'] = $this->banner_model->total_records; 

事情變得複雜,當你開始使用連接,就像在我的例子,你想顯示從一個特定的公司標語!你可以閱讀我的博客文章就這一問題進一步:

http://www.azmeer.info/pagination-hitting-the-database-twise/