如何在Laravel Eloquent中为多条件搜索API添加分页与偏移参数
如何在Laravel用户搜索API中添加分页与偏移参数?
首先,我们要在数据库查询层面直接应用分页和偏移参数——千万别先拉取所有数据再做分页,这种做法在数据量大的时候会严重浪费数据库资源。
步骤1:获取并校验分页参数
先从请求里取出新增的offset和paginate参数,同时做合法性校验,避免非法值引发错误:
// 获取分页参数,设置默认值并确保数值合法 $offset = max(0, (int)$request->input('offset', 0)); // 默认偏移0,禁止负数 $perPage = max(1, (int)$request->input('paginate', 10)); // 默认每页10条,最少返回1条
步骤2:在查询中植入分页逻辑
修改你原有的查询代码,用skip()和take()方法替代直接调用get(),这两个方法会让数据库直接执行分页逻辑,效率更高:
$pram = $request->name; $email= $request->email; $roleId= $request->role_id; // 先处理合法的分页参数 $offset = max(0, (int)$request->input('offset', 0)); $perPage = max(1, (int)$request->input('paginate', 10)); $results = User::where('email','like', '%' . $email . '%') ->WhereHas('userBasicInfo', function ($query) use ($pram) { $query->where('first_name', 'like', '%' . $pram . '%') ->orWhere('middle_name', 'like', '%' . $pram . '%') ->orWhere('last_name', 'like', '%' . $pram . '%'); }) ->with(['userBasicInfo' => function ($query) use ($pram) { $query->where('first_name', 'like', '%' . $pram . '%') ->orWhere('middle_name', 'like', '%' . $pram . '%') ->orWhere('last_name', 'like', '%' . $pram . '%'); }]) ->skip($offset) // 跳过指定数量的记录,实现偏移 ->take($perPage) // 只返回指定数量的记录,实现分页 ->get() ->toArray();
额外优化建议
- 变量名
$pram可以改成$nameKeyword,让代码可读性更强; - 如果前端需要做分页导航,可以额外查询总记录数,一起返回给前端:
// 查询符合条件的总记录数 $total = User::where('email','like', '%' . $email . '%') ->WhereHas('userBasicInfo', function ($query) use ($pram) { $query->where('first_name', 'like', '%' . $pram . '%') ->orWhere('middle_name', 'like', '%' . $pram . '%') ->orWhere('last_name', 'like', '%' . $pram . '%'); }) ->count(); // 返回包含分页元数据的结果 return [ 'data' => $results, 'total' => $total, 'offset' => $offset, 'paginate' => $perPage ];
内容的提问来源于stack exchange,提问作者syed1234
相关产品推荐
相关产品推荐

