1. 程式人生 > >ThinkPHP獲取帶條件資料總條數(行數)

ThinkPHP獲取帶條件資料總條數(行數)

首先來看一下分頁原理:

比如下面這個表:


總共有31條資料,篩選出sex為男的SQL為:

select * from user where sex='男';


sex為男的有20條資料,那怎麼知道sex為男的有20條資料呢,當然是用SQL的count關鍵字了:


再根據這20條資料分頁,每頁8條資料,知道了總資料條數和每頁條數就可以算出總頁數了:ceil(20/8)=3,(ceil為向上取整),總共為3頁,最後一頁4條資料,SQL及結果如下:


可以看出,分頁是用limit關鍵字來實現的,上面limit的兩個引數,第一個就是從第幾條資料開始,第二個是要獲取多少條資料,這個例子每頁8條資料,那limit的第二個引數就固定為8了,假設頁數(頁碼)為n,那第一個引數就是(n-1)*8,第1、2、3頁的limit分別為0,8、8,8、16,8;

所以前端只要給後端傳第幾頁就可以篩選出那一頁的資料了。

其實主要是獲取符合條件的資料總條數和構造limit就可以實現分頁了。那在ThinkPHP中是怎麼來實現這個呢。

ThinkPHP的Model.class.php裡有count方法,但是並不能傳入where條件,只能得到整個表的資料行數,這就給我帶來一些不便了,像上面這個例子就跑不通。要麼就自己構造SQL語句去查詢,要麼就是把所有資料select出來之後count一下資料集有多少;顯然這兩種方法都不太理想,也不是我的風格,所以索性就直接改它程式碼得了,做的修改如下:

1、在Model.class.php中新增一個成員變數:

    // 上次查詢表示式引數                                                       
    protected $last_options     =   array();  
$last_options這個變數是用來儲存上次查詢的options,因為每調一次select都會把$options重置(重置程式碼在_parseOptions方法中),所以這裡用$last_options來儲存,以便後面有用。

2、在select方法的開始要儲存options到last_options:

    public function select($options=array()) {                                  
        $this->last_options = $this->options;
        ……
    }

3、在Model.class.php中新增一個where_count的方法:

    public function where_count() {                                                 
        $this->options = $this->last_options;  //這裡用last_options恢復到options中                              
        unset($this->options['order']);                                             
        return $this->getField(strtoupper("count").'(*) AS tp_count');              
    }

這樣在我們查詢完每一頁的時候就可以呼叫where_count得出總條數了:
$user_db = M("user");
$rows = 8;
$limit = ($page - 1) * $rows . "," . $rows;
$list = $user_db->where(array("sex"=>" 男"))->order("id asc")->limit($limit)->select();
$count = $user_db->where_count();
……

希望對你有幫助,如有更好的方法,歡迎指教!