如何在Laravel CRUD系统中实现管理员用户名搜索过滤功能
Laravel用户搜索功能实现方案
1. web.php路由配置
直接在routes/web.php文件中添加以下路由即可匹配你表单提交的/search地址:
// 建议放在管理员权限路由组内,避免未授权访问 Route::get('/search', [\App\Http\Controllers\UserController::class, 'search'])->middleware(['auth']);
如果你已经配置了管理员专属路由组,把这条路由放到组内即可,不需要重复加权限中间件。
2. 现有代码问题修复
你当前的代码还有几处问题会导致搜索功能异常,同步修改即可:
2.1 UserController的search方法修正
public function search(Request $request) { // 权限校验和index方法保持一致 if(Gate::denies('logged-in')){ dd('no acces'); } if(Gate::denies('is-admin')){ dd("adminnak kell lenned"); } $search = $request->get('search'); // 修正1:Eloquent模型直接调用where,不需要加table('users') // 修正2:分页追加搜索参数,避免翻页时搜索条件丢失 $users = User::where('name', 'like', '%'.$search.'%')->paginate(10)->appends(['search' => $search]); // 修正3:返回视图和index一致,为admin.users.index而非admin return view('admin.users.index', compact('users', 'search')); }
2.2 Blade模板修正
修改搜索框的input标签,默认填充当前搜索词,方便用户二次修改:
<input type="search" name="search" class="form-control" value="{{ $search ?? '' }}">
你当前的分页代码{{ $users->links() }}已经可以正常工作,因为Controller中已经通过appends方法绑定了搜索参数。
3. 可选优化:合并搜索逻辑到index方法(无需单独路由)
你可以直接把搜索逻辑整合到index方法中,不需要单独维护search路由和方法,修改后index方法代码如下:
public function index(Request $request) { if(Gate::denies('logged-in')){ dd('no acces'); } if(Gate::denies('is-admin')){ dd("adminnak kell lenned"); } $search = $request->get('search'); // 存在搜索词时才加过滤条件 $users = User::when($search, function ($query) use ($search) { return $query->where('name', 'like', '%'.$search.'%'); })->paginate(10)->appends(['search' => $search]); return view('admin.users.index', compact('users', 'search')); }
修改后把Blade表单的提交地址改成用户列表路由即可:
<form action="{{ route('admin.users.index') }}" method="GET">
这种写法更简洁,也不用额外配置搜索路由。
内容的提问来源于stack exchange,提问作者Kis Gábor
相关产品推荐
相关产品推荐

