因为是写接口,所以分页的数据有些用不到,因此直接取出需要的,另外,前端往往展示是跨表的,对于分页结果还需要进行提取出需要的字段,直接上代码,应该一看都明白了.
public function index(Request $request)
{
$params = $request->validate([
'search' => 'string',
'per_page' => 'int|min:1',
]);
$per_page = $params['per_page'] ?? 10;
$search = $params['search'] ?? '';
$data = DB::table('xxxx as qsrr')
->leftJoin('yyyy as qs', 'qsrr.screen_id', '=', 'qs.id')
->leftJoin('zzzz as qr', 'qsrr.resource_id', '=', 'qr.id')
->where('qsrr.user_id', $this->uid()) // 限定当前用户和正常关联
->whereIn('qsrr.status', [ModelConst::STATUS_VALID, ModelConst::STATUS_DISSOLUTION])
->when($search, function ($query) use ($search) {
$query->where('qr.original_name', 'like', "%{$search}%")
->orWhere('qs.name', 'like', "%{$search}%");
})
->orderBy('qsrr.id', 'desc')
->select(['qsrr.id', 'qsrr.screen_id', 'qsrr.status', 'qsrr.resource_id', 'qsrr.created_at', 'qs.name', 'qr.original_name'])
->paginate($per_page);
// 改变分页里面的data,增加一些字段
$data->transform(function ($value) {
$value->app_version = YYYY::where('id', $value->screen_id)->value('app_version');
$value->url = ZZZZ::find($value->resource_id)->url ?? '';
return $value;
});
return out_put_json($this->formatPaginate($data));
}
// 改变分页后的数据字段,屏蔽不需要的
public function formatPaginate(LengthAwarePaginator $data)
{
// dd(get_class_methods($data));
if ($data->isEmpty()) {
return (object)[];
}
return [
'total' => $data->total(),
'result' => $data->items(),
];
}
$data = ConstModel::where('type', ConstModel::TYPE_CATEGORY)
->where('attribute', 'like', '%"' . $params['lang'] . '"%')
->orderBy('id', 'desc')
->paginate($per_page, ['attribute', 'id'], 'page', $page);
$data->getCollection()->transform(function ($model) use ($params) {
$attribute = json_decode($model->attribute, true);
foreach ($attribute as $item) {
if ($item['language'] == $params['lang']) {
$model->attribute = $item['name'];
return $model;
}
}
});