laravel对分页的paginate数据进行变更

曹旭东
2023-12-01

因为是写接口,所以分页的数据有些用不到,因此直接取出需要的,另外,前端往往展示是跨表的,对于分页结果还需要进行提取出需要的字段,直接上代码,应该一看都明白了.

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;
        }
    }
});
 类似资料: