ThinkPHP 分頁和原生查詢
1. 前言
本小節介紹 ThinkPHP 框架的分頁查詢和原生查詢,通過定義一個學生列表來介紹分頁查詢的目的是限制請求返回的數據量,防止內存被打滿,原生查詢主要用于 sql
語句比較復雜的場景。
2. 批量添加多條學生信息
為了演示方便需要添加多條學生信息,下面給出 ThinkPHP 添加多條學生信息的方法:
public function addStudents()
{
$nameArr = ["吳小明", "張紅", "趙四", "王五", "錢學", "孫空", "李珍"];
$ageArr = [18, 19, 20, 21, 22, 23, 24, 25];
$saveArr = [];
$createdAt = time();
for ($i = 0; $i < 200; $i++) {
$arr = [];
$arr['name'] = $nameArr[array_rand($nameArr)];
$arr['age'] = $ageArr[array_rand($ageArr)];
$arr['id_number'] = "42011720100512" . mt_rand(1000, 9999);
$arr['status'] = 1;
$saveArr[] = $arr;
}
Db::table('student')->insert($saveArr);
return json('添加成功');
}
Tips: 也可以通過
sql
語句在MySQL
客戶端自行添加。
如下圖所示:
3. 獲取學生分頁列表接口
3.1 定義路由
首先在 study.php
路由文件添加 GET
路由如下:
//獲取學生列表接口
Route::get('students', 'app\controller\Study\StudentController@getStudents');
如下圖所示:
3.2 定義路由指向的方法
下面定義一下路由里面指向的 getStudents()
方法,方法如下:
/**
* 獲取學生列表
* @return \think\response\Json
* @throws \think\db\exception\DbException
*/
public function getStudents()
{
//每頁條數
$size = (int)$this->request->param('size', 15);
$students = StudentModel::where('status', 1)->order('created_at DESC')->paginate($size);
return json($students);
}
Tips:
paginate($size)
方法表示使用數據庫查詢分頁且每頁$size
條,order('created_at DESC')
表示列表按照創建時間倒序。
3.4 請求接口獲取分頁學生列表
如下圖所示,可以在 postman
請求上述定義好的學生分頁列表:
Tips:
page
表示翻頁參數,這個參數不需要在控制器去接收,框架中的paginate()
方法底層代碼會處理page
參數,但size
參數是需要在控制器接收的,這里列表數據沒有處理時間格式。
下面對返回參數說明一下:
返回參數 | 含義描述 |
---|---|
total | 總條數 |
per_page | 每頁條數 |
current_page | 當前頁數 |
last_page | 總頁數 |
data | 列表數據 |
4. 原生查詢
下面主要介紹一下 ThinkPHP 框架原生查詢,一般情況下,框架自帶的方法都可以滿足大多數查詢需求,但有時候對于復雜的 sql
查詢邏輯,使用原生查詢比較合適,下面定義一個方法使用原生查詢獲取學生列表數據:
/**
* 獲取學生列表
* @return \think\response\Json
* @throws \think\db\exception\DbException
*/
public function getStudents()
{
//每頁條數
$size = (int)$this->request->param('size', 15);
//頁數
$page = (int)$this->request->param('page', 1);
$limit = ($page - 1) * $size;
$students = Db::query("select * from `student` where `status`=1 order by created_at desc limit {$limit},{$size}");
return json($students);
}
若 page=2
、size=5
返回數據如下:
[
{
"id": 6,
"name": "王五",
"age": 25,
"id_number": "420117201005123617",
"created_at": 1603617951,
"update_at": 0,
"status": 1
},
{
"id": 7,
"name": "張紅",
"age": 19,
"id_number": "420117201005123721",
"created_at": 1603617951,
"update_at": 0,
"status": 1
},
{
"id": 8,
"name": "吳小明",
"age": 21,
"id_number": "420117201005123197",
"created_at": 1603617951,
"update_at": 0,
"status": 1
},
{
"id": 9,
"name": "錢學",
"age": 19,
"id_number": "420117201005121149",
"created_at": 1603617951,
"update_at": 0,
"status": 1
},
{
"id": 10,
"name": "孫空",
"age": 21,
"id_number": "420117201005124671",
"created_at": 1603617951,
"update_at": 0,
"status": 1
}
]
Tips: 此時的數據結構和上面分頁的不一樣。
5. 小結
本小節介紹了如何使用分頁查詢學生列表,分頁查詢的目的就是為了控制每頁的條數從控制請求數據量過大的問題,分頁查詢中的 page
參數表示頁數,這個參數在 ThinkPHP
框架中會自動處理,每頁條數默認是 15
,若需要改變分頁每頁條數,則需要向 paginate()
方法傳遞條數參數。
Tips: 代碼倉庫:https://gitee.com/love-for-poetry/tp6