Laravel表单提交丢失页码问题求助
解决排序下拉框提交丢失页码参数的问题
这个问题的核心原因很明确:你的表单里没有包含当前的page参数,所以当你切换下拉框触发表单提交时,只会发送orderby和order这两个字段,自然就丢失了页码信息。下面是具体的修复方案:
步骤1:在表单中添加页码隐藏字段
修改你的前端表单,在<form>标签内添加一个隐藏的<input>元素,把当前请求中的page值传进去:
<form action="{{ route('home') }}" method="GET"> <!-- 新增隐藏字段,传递当前页码 --> <input type="hidden" name="page" value="{{ Request()->page ?? 1 }}"> <div class="row"> <div class="col-2"> <label for="nom">Trier par :</label> </div> <div class="col-tier form-group"> <select class="form-control" name="orderby" id="orderby" onchange="this.form.submit()"> <option value="nom" {{ Request()->orderby == 'nom' ? ' selected' : '' }}>Nom</option> <option value="created_at" {{ Request()->orderby == 'created_at' ? ' selected' : '' }}>Date de création</option> <option value="updated_at" {{ Request()->orderby == 'updated_at' ? ' selected' : '' }}>Date de modification</option> </select> </div> <div class="col-tier form-group "> <select class="form-control" name="order" id="order" onchange="this.form.submit()"> <option value="desc" {{ Request()->order == 'desc' ? ' selected' : '' }}>Desc</option> <option value="asc" {{ Request()->order == 'asc' ? ' selected' : '' }}>Asc</option> </select> </div> </div> </form>
这样表单提交时,就会自动带上当前的page参数,URL就能变成你想要的格式:home?orderby=created_at&order=desc&page=2。
步骤2:优化控制器的排序逻辑(可选但推荐)
你的控制器代码里的排序判断可以简化一下,避免重复的paginate和appends代码:
public function index(Request $request) { $user = Auth::user(); // 获取排序方向,默认ASC $sort = $request->get('order') === 'desc' ? 'DESC' : 'ASC'; // 获取排序字段,默认nom $orderBy = $request->get('orderby') ?? 'nom'; // 确保排序字段是允许的,防止SQL注入风险 $allowedFields = ['nom', 'created_at', 'updated_at']; if (!in_array($orderBy, $allowedFields)) { $orderBy = 'nom'; } $grilles = Grille::orderBy($orderBy, $sort) ->paginate(15) ->appends($request->query()); // 保留所有请求参数 return view('home', compact('grilles')); }
这里做了两个优化:
- 用三元运算符简化排序方向和字段的判断
- 添加了允许的字段白名单,避免用户传入恶意字段导致SQL注入
- 统一使用
$request->query()来保留所有请求参数,不用重复写多次
步骤3:确认分页的appends逻辑
你的分页代码里用了appends(request()->except('page')),这个是正确的,因为分页组件会自动处理page参数,所以不需要手动传递。保持当前的分页代码即可:
<div id="pagination" class="d-flex justify-content-center"> {{ $grilles->appends(request()->except('page'))->links() }} </div>
这样修改后,无论是切换分页还是切换排序下拉框,所有需要的参数(orderby、order、page)都会被正确保留在URL中了。
内容的提问来源于stack exchange,提问作者J.C
相关产品推荐
相关产品推荐

