我想在格式回應中使用 Laravel 為 API 進行簡單的分頁,如下所示:
{
"code": 0,
"message": "success",
"data": [
{...},
{...}
],
"page_context": {
"page": 2,
"per_page": 25,
"has_more_page": false
}
}
如何做到這一點?我不喜歡 Laravel Model::paginate() 函式。
uj5u.com熱心網友回復:
您可以從創建一個輔助類開始:
<?php
namespace App\Helpers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
class AppHelper
{
public static function defaultMetaInput($input) : array
{
$page = isset($input['page']) ? (int)$input['page'] : 1;
$perPage = isset($input['perPage']) ? (int)$input['perPage'] : 50;
$order = $input['order'] ?? 'created_at';
$dir = $input['dir'] ?? 'desc';
$search = isset($input['search']) ? ($input['search']) : '';
$offset = ($page - 1) * $perPage;
return [
'order' => $order,
'dir' => $dir,
'page' => $page,
'perPage' => $perPage,
'offset' => $offset,
'search' => $search,
];
}
public static function additionalMeta($meta, $total)
{
$meta['total'] = $total;
$meta['totalPage'] = ceil( $total / $meta['perPage']);
if($meta['totalPage'] < $meta['page']){
$meta['page'] = $meta['totalPage'];
}
return $meta;
}
}
這只是一個輔助函式,我創建了它,因為幾乎在每個 crud 上,可能會傳遞相同的元資料,因此我可以將所有這些資料放在一個變數中。
現在,在控制器上做這樣的事情:
//storing all meta data on a single $meta variable
$meta = AppHelper::defaultMetaInput($request->only(['page', 'perPage', 'order', 'dir','search']));
$query = \DB::table('users as u')
->select('u.*');
$query->where(function($q) use($meta){
$q->orWhere('u.name', 'like', $meta['search'] . '%')
->orWhere('u.email', 'like', $meta['search'] . '%');
});
$total = $query->count();
//adding total data on the meta varaible to send on front end,
//so that this data could be used for pagination on front end
$meta = AppHelper::additionalMeta($meta, $total);
$query->orderBy($meta['order'], $meta['dir']);
//if perPage = -, it will returns all data from the table
if ($meta['perPage'] != '-1') {
$query->offset($meta['offset'])->limit($meta['perPage']);
}
$results = $query->get();
return [
'results' => $results,
'meta' => $meta
];
這是一個示例,您可以根據需要調整資料。我meta在我的示例中使用過,您可以將其重命名為任何變數,此外,對于您的案例has_more_page變數,您可以檢查是否$meta['totalPage'] === $meta['page']沒有更多頁面。
如果您需要問題中提到的確切結構,您可以回傳它。
return [
'code' => 0,
'message' => 'Success',
'data' => $results,
'page_context' => [
'page' => $meta['page'],
'per_page' => $meta['perPage'],
'has_more_page' => ($meta['totalPage'] === $meta['page'])?false:true,
]
];
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/472219.html
