Laravel排序后分页丢失筛选参数引发SQL列不存在错误求助
解决Laravel排序后分页丢失参数的问题
问题根源
点击分页按钮时,Laravel默认生成的分页链接仅包含page参数,不会自动保留排序用的filter参数,导致下一页请求时$request->filter为空,进而触发SQL错误(ORDER BY `` DESC)。
解决方案
1. 控制器代码修改
需要同时完成排序字段合法性验证(防止SQL注入)和分页链接附加参数两个操作,修改后的代码如下:
public function Sortfilter(Request $request) { $active = Customer::where('active', 1)->count(); $inactive = Customer::where('active', 0)->count(); // 定义允许排序的字段白名单,避免恶意参数注入 $allowedFilters = ['name', 'phone', 'email', 'created_at']; // 若请求的filter不在白名单内,默认按id排序 $filter = in_array($request->filter, $allowedFilters) ? $request->filter : 'id'; // 分页时将filter参数附加到所有分页链接 $customer = Customer::orderBy($filter, 'desc') ->paginate(3) ->appends($request->only('filter')); return view('customers.index', compact('customer','inactive','active')); }
2. 关键说明
- 字段白名单验证:直接使用用户传入的
$request->filter存在SQL注入风险,必须限制仅允许模型中存在的字段参与排序。 appends()方法:该方法会将指定参数附加到所有分页链接中,点击下一页时URL会自动带上filter=phone这类参数,保证排序条件在分页过程中不丢失。
3. 简化写法(可选)
若完全信任请求来源(不推荐),可直接附加所有请求参数:
$customer = Customer::orderBy($request->filter ?? 'id', 'desc') ->paginate(3) ->appends($request->all());
内容的提问来源于stack exchange,提问作者maha messaoud
相关产品推荐
相关产品推荐

