如何在Laravel的搜索表单中实现带筛选参数保留的分页功能
核心问题排查&修复方案
存在的3个核心错误
- 表单提交地址配置错误,提交到了无筛选逻辑的
index方法,而非search方法 - 控制器未将筛选参数传递到视图,导致分页
appends追加的参数为空 - 控制器中存在多余的
else逻辑,会出现变量覆盖问题
分步修复代码
1. 修正控制器逻辑
namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Contact; class ContactController extends Controller { // 可直接删除index方法,后续统一用search方法处理列表+筛选 public function search(Request $request) { $query = Contact::query(); // 批量提取所有筛选参数,后续统一传递到视图 $filters = $request->only(['fullname', 'gender', 'email', 'created_at_start', 'created_at_end']); // 逐个应用筛选条件 if (!empty($filters['fullname'])) { $query->where('fullname', 'like', "%{$filters['fullname']}%"); } if (!empty($filters['gender'])) { $query->where('gender', $filters['gender']); } // 其余筛选条件按上述格式自行补充 // 统一执行分页,删除原来冗余的else赋值逻辑 $contacts = $query->paginate(10); // 将筛选参数一并传递到视图 return view('admin/index', compact('contacts', 'filters')); } }
2. 修正路由配置
删除冗余的index路由,统一用一个路由处理列表访问、筛选、分页:
use Illuminate\Support\Facades\Route; use App\Http\Controllers\ContactController; Route::get('/', function () { return view('index'); }); // 合并原来的两个admin路由,统一绑定到search方法 Route::get('admin', [ContactController::class, 'search'])->name('admin.search');
3. 修正前端表单&分页代码
GET请求不需要@csrf,同时修改分页参数追加逻辑:
<form class="search-box__items" action="{{ route('admin.search') }}" method="GET"> <label class="search-box__items__label"> Name <input name="fullname" type="text" class="search-box__item" value="{{ $filters['fullname'] ?? '' }}"> </label> <!-- 其余筛选字段按上述格式补充value值 --> <input type="submit" value="Search"> </form> <div class="contacts"> <div class="pagination"> <!-- 批量追加所有筛选参数到分页链接 --> {{ $contacts->appends($filters)->links() }} </div> <div class="contacts-table"> <!-- 询盘列表代码 --> </div> </div>
内容的提问来源于stack exchange,提问作者Takichee
相关产品推荐
相关产品推荐

