[TOC]
## page方法
>[info] 其實limit 方法完全可以實現分頁查詢 ,但是page提供了一種更加人性化的體驗
### 1、功能:為分頁查詢提供更加直觀的實現方法
### 2、源碼:/thinkphp/library/think/db/Query.php
~~~
/**
* 指定分頁
* @access public
* @param mixed $page 頁數
* @param mixed $listRows 每頁數量
* @return $this
*/
public function page($page, $listRows = null)
{
if (is_null($listRows) && strpos($page, ',')) {
list($page, $listRows) = explode(',', $page);
}
$this->options['page'] = [intval($page), intval($listRows)];
return $this;
}
~~~
>[info] 看到源碼是否覺得眼熟呢?對,與limit方法源碼極其相似,區別在于給查詢選擇options[ 'page' ]賦值,limit是字符串,page是一個數組;
### 3、參數與返回值
* 參數很有意思,值得嘮一嘮
| 序號 | 參數 | 說明 |
| :---: | --- | --- |
| 1 | $page / 數字 / 字符串 | 根據公式計算出來的當前頁數,公式后面介紹 |
| 2 | $listRows / 數字 / 字符串 | 每頁顯示的記錄數量 |
* 返回值:仍然是當前查詢對象本身。
### 4、實例演示
* 這里我們先以上節課學過的limit方法實現一下:
~~~
// 顯示第一頁數據
Db::table('tp5_staff') -> field('id,name,salary') -> limit(0,5) -> select();
// 顯示第二頁數據,只需要將起始位置由0,改為3即可
Db::table('tp5_staff') -> field('id,name,salary') -> limit(5,5) -> select();
// 以此類推,第三頁
Db::table('tp5_staff') -> field('id,name,salary') -> limit(10,5) -> select();
~~~
>[success] 規律(計算公式):
>* limit參數中,變化是的起始位置$offset,查詢數量是不變的$listRows;
>* $offset變化規律:(當前頁碼 - 1)* 每頁顯示數量 (這里假設為 5 )
> * 如第1頁的起始位置:(1-1)* 5 = 0 ,即 : limit( 0, 5);
> * 第2頁的起始位置:(2-1)* 5 =5,即:limit( 5, 5);
> * 第3頁的起始位置:(3-1)* 5 =10 , 即:limit( 10,5 );
> * 以下頁,就依此類推即可。
* 明白了分頁規律后,用page方法可以大簡化這種操作,將上例改寫:
~~~
// 顯示第一頁數據
Db::table('tp5_staff') -> field('id,name,salary') -> page(1,5) -> select();
// 顯示第二頁數據,只需要將起始位置由0,改為3即可
Db::table('tp5_staff') -> field('id,name,salary') -> page(2,5) -> select();
// 以此類推,第三頁
Db::table('tp5_staff') -> field('id,name,salary') -> page(3,5) -> select();
~~~
>[success] page方法中第一個參數是顯示頁數,第二個是顯示數量,這樣一來,代碼顯示整潔直觀。
* page方法可以只有一個參數:頁數,此時,需要與limit方法配合工作
~~~
// 顯示第一頁數據,page方法參數為1,后面跟上limit方法設置顯示數量
Db::table('tp5_staff') -> field('id,name,salary') -> page( 1 ) -> limit( 5 ) -> select();
// 顯示第二頁數據,page方法參數為2,后面跟上limit方法設置顯示數量
Db::table('tp5_staff') -> field('id,name,salary') -> page( 2 ) -> limit( 5 ) -> select();
// 以此類推,第三頁
Db::table('tp5_staff') -> field('id,name,salary') -> page( 3 ) -> limit( 5 ) -> select();
~~~
>[info] 使用了page( 頁數 ) -> limit( 數量 ) 語法,代碼是不是更加的簡潔、優雅了呢?
#### 任務1:以每頁5條記錄方法,顯示前三頁數據(tp5_staff表)
* Index.php 控制器代碼如下:
~~~
<?php
namespace app\index\controller;
//導入數據庫類
use think\Db;
class Index {
public function index(){
$result = Db::table('tp5_staff') // 設置數據表
-> field(['name' => '姓名','salary' => '工資']) // 設置顯示的字段別名
-> page(2,5) //設置顯示第二頁,每頁顯示5條記錄
->select(); //生成結果集
//查看結果
dump($result);
}
}
~~~
* 查詢結果如下:
~~~
array(5) {
[0] => array(2) {
["姓名"] => string(9) "西門慶"
["工資"] => float(19801)
}
[1] => array(2) {
["姓名"] => string(9) "潘金蓮"
["工資"] => float(8567)
}
[2] => array(2) {
["姓名"] => string(6) "宋江"
["工資"] => float(9261)
}
[3] => array(2) {
["姓名"] => string(9) "老頑童"
["工資"] => float(5000)
}
[4] => array(2) {
["姓名"] => string(9) "歐陽峰"
["工資"] => float(4900)
}
}
~~~
* 生成的SQL語句:
~~~
SELECT `name` AS `姓名`,`salary` AS `工資` FROM `tp5_staff` LIMIT 5,5
~~~
* 在SQLPRO FOR MySQL 中查看:

### 4、總結:
>[info] 其實在開發,page方法用得較少,更多的是使用limit方法。但page方法仍需要知道其基本用法,因為我們會在讀其它程序員的源碼時會遇到。
- 前言[隨時更新]
- ThinkPHP 5數據庫重構
- 開發環境
- 1.ThinkPHP5開發環境(Mac版)
- 2.ThinkPHP5開發環境(Win版)
- MySQL快速復習
- 1.數據庫操作
- 2.數據表操作
- 1.創建數據表 (重點)
- 2.添加數據表記錄
- 3.查詢數據表(重點)
- 4.更新數據表
- 5.編輯數據表結構(重點)
- 6_復制數據表
- 7.刪除數據和表
- 連接數據庫
- 1.數據庫配置文件database.php
- 2.Db類靜態方法connect()
- 3.模塊中的配置文件config.php
- MySQL原生查詢
- 1.讀操作query
- 2.寫操作execute
- 選擇數據表
- 1.table與setTable方法
- 2.name方法
- 3.db助手函數
- 4.alias方法
- 結果集查詢
- 1.find方法
- 2.select方法
- 3.fetchSql方法
- 4.value方法
- 5.column方法
- 6.field方法
- 新增數據
- 1.insert_單條添加
- 2.insertAll_批量添加
- 3_db_助手函數添加
- 更新數據
- 1.update方法
- 2.setField更新字段
- 3_自增自減與延時更新
- 刪除數據
- 1.delete方法
- 查詢方法
- 1.getTableInfo方法
- 2.where方法
- 3.whereOr方法
- 4.混合查詢(閉包實現)
- 表達式查詢
- 1.表達式查詢(重點)
- 2.exp通用查詢
- 分組查詢
- 1.group方法
- 2.having方法
- 排序分頁查詢
- 1.order方法
- 2.limit方法
- 3.page方法
- 聚合查詢
- 時間查詢
- 1.where方法
- 2.whereTime方法
- 高級查詢
- 1.快捷查詢
- 2.區間查詢
- 3.批量查詢
- 4.Query對象查詢
- 5.混合查詢
- 視圖查詢
- view方法
- 子查詢
- 1.select方法
- 2.fetchSql方法
- 3.buildSql方法
- 4.閉包子查詢
- 總結/參考
- 1.方法參數類型總結
- 2.查詢/子查詢/連接查詢