ThinkPHP 分頁和原生查詢
1. 前言
本小節(jié)介紹 ThinkPHP 框架的分頁查詢和原生查詢,通過定義一個(gè)學(xué)生列表來介紹分頁查詢的目的是限制請(qǐng)求返回的數(shù)據(jù)量,防止內(nèi)存被打滿,原生查詢主要用于 sql
語句比較復(fù)雜的場(chǎng)景。
2. 批量添加多條學(xué)生信息
為了演示方便需要添加多條學(xué)生信息,下面給出 ThinkPHP 添加多條學(xué)生信息的方法:
public function addStudents()
{
$nameArr = ["吳小明", "張紅", "趙四", "王五", "錢學(xué)", "孫空", "李珍"];
$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. 獲取學(xué)生分頁列表接口
3.1 定義路由
首先在 study.php
路由文件添加 GET
路由如下:
//獲取學(xué)生列表接口
Route::get('students', 'app\controller\Study\StudentController@getStudents');
如下圖所示:
3.2 定義路由指向的方法
下面定義一下路由里面指向的 getStudents()
方法,方法如下:
/**
* 獲取學(xué)生列表
* @return \think\response\Json
* @throws \think\db\exception\DbException
*/
public function getStudents()
{
//每頁條數(shù)
$size = (int)$this->request->param('size', 15);
$students = StudentModel::where('status', 1)->order('created_at DESC')->paginate($size);
return json($students);
}
Tips:
paginate($size)
方法表示使用數(shù)據(jù)庫查詢分頁且每頁$size
條,order('created_at DESC')
表示列表按照創(chuàng)建時(shí)間倒序。
3.4 請(qǐng)求接口獲取分頁學(xué)生列表
如下圖所示,可以在 postman
請(qǐng)求上述定義好的學(xué)生分頁列表:
Tips:
page
表示翻頁參數(shù),這個(gè)參數(shù)不需要在控制器去接收,框架中的paginate()
方法底層代碼會(huì)處理page
參數(shù),但size
參數(shù)是需要在控制器接收的,這里列表數(shù)據(jù)沒有處理時(shí)間格式。
下面對(duì)返回參數(shù)說明一下:
返回參數(shù) | 含義描述 |
---|---|
total | 總條數(shù) |
per_page | 每頁條數(shù) |
current_page | 當(dāng)前頁數(shù) |
last_page | 總頁數(shù) |
data | 列表數(shù)據(jù) |
4. 原生查詢
下面主要介紹一下 ThinkPHP 框架原生查詢,一般情況下,框架自帶的方法都可以滿足大多數(shù)查詢需求,但有時(shí)候?qū)τ趶?fù)雜的 sql
查詢邏輯,使用原生查詢比較合適,下面定義一個(gè)方法使用原生查詢獲取學(xué)生列表數(shù)據(jù):
/**
* 獲取學(xué)生列表
* @return \think\response\Json
* @throws \think\db\exception\DbException
*/
public function getStudents()
{
//每頁條數(shù)
$size = (int)$this->request->param('size', 15);
//頁數(shù)
$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
返回?cái)?shù)據(jù)如下:
[
{
"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": "錢學(xué)",
"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: 此時(shí)的數(shù)據(jù)結(jié)構(gòu)和上面分頁的不一樣。
5. 小結(jié)
本小節(jié)介紹了如何使用分頁查詢學(xué)生列表,分頁查詢的目的就是為了控制每頁的條數(shù)從控制請(qǐng)求數(shù)據(jù)量過大的問題,分頁查詢中的 page
參數(shù)表示頁數(shù),這個(gè)參數(shù)在 ThinkPHP
框架中會(huì)自動(dòng)處理,每頁條數(shù)默認(rèn)是 15
,若需要改變分頁每頁條數(shù),則需要向 paginate()
方法傳遞條數(shù)參數(shù)。
Tips: 代碼倉庫:https://gitee.com/love-for-poetry/tp6