Laravel中如何通过GET方法将表单搜索参数拼入URL并展示筛选结果?
在Laravel中实现GET方式的城市&房型筛选流程
我来给你一步步拆解这个需求,Laravel里做GET参数的筛选搜索其实非常直观,咱们从表单构建到结果展示全流程走一遍:
1. 构建GET类型的搜索表单
首先你需要在Blade视图里创建一个GET方法的表单,Laravel会自动把表单字段拼接到URL参数里。示例代码如下:
<form action="{{ route('search') }}" method="GET" class="search-form"> <div class="form-group"> <label for="city">选择城市</label> <select name="city" id="city" class="form-control"> <option value="">全部城市</option> <option value="beijing" {{ request('city') == 'beijing' ? 'selected' : '' }}>北京</option> <option value="shanghai" {{ request('city') == 'shanghai' ? 'selected' : '' }}>上海</option> <option value="guangzhou" {{ request('city') == 'guangzhou' ? 'selected' : '' }}>广州</option> </select> </div> <div class="form-group"> <label for="room_type">选择房型</label> <select name="room_type" id="room_type" class="form-control"> <option value="">全部房型</option> <option value="single" {{ request('room_type') == 'single' ? 'selected' : '' }}>单人房</option> <option value="double" {{ request('room_type') == 'double' ? 'selected' : '' }}>双人房</option> <option value="suite" {{ request('room_type') == 'suite' ? 'selected' : '' }}>套房</option> </select> </div> <button type="submit" class="btn btn-primary">搜索</button> </form>
这里注意几个点:
- 表单
method必须设为GET,这样提交后参数会自动拼到URL(比如/search?city=shanghai&room_type=double) - 用
request('字段名')来判断用户之前的选择,实现表单回显,提升用户体验
2. 定义对应的路由
在routes/web.php里添加一个GET路由,指向你的搜索控制器:
use App\Http\Controllers\SearchController; Route::get('/search', [SearchController::class, 'index'])->name('search');
3. 控制器中处理筛选逻辑
创建SearchController(可以用php artisan make:controller SearchController生成),在index方法里获取URL参数,构建查询条件并返回结果:
namespace App\Http\Controllers; use App\Models\Room; use Illuminate\Http\Request; class SearchController extends Controller { public function index(Request $request) { // 可选:添加参数验证,防止非法输入 $request->validate([ 'city' => 'nullable|string|exists:rooms,city', // 如果city是rooms表的字段,可加exists验证 'room_type' => 'nullable|string|in:single,double,suite' ]); // 初始化查询构建器 $query = Room::query(); // 根据城市筛选 if ($request->has('city') && $request->city) { $query->where('city', $request->city); } // 根据房型筛选 if ($request->has('room_type') && $request->room_type) { $query->where('room_type', $request->room_type); } // 分页获取结果(可选,推荐用分页提升性能) $rooms = $query->paginate(10); // 把请求对象和结果传给视图,方便后续回显参数和分页 return view('search.results', compact('rooms', 'request')); } }
如果筛选条件较多,推荐用when方法简化代码,比如:
$query->when($request->city, function ($q) use ($request) { return $q->where('city', $request->city); })->when($request->room_type, function ($q) use ($request) { return $q->where('room_type', $request->room_type); });
4. 视图展示筛选结果
在resources/views/search/results.blade.php里展示筛选后的房型数据,同时处理分页时的参数保留:
<h2>搜索结果:共 {{ $rooms->total() }} 条</h2> <div class="room-list"> @foreach($rooms as $room) <div class="room-item"> <h3>{{ $room->name }}</h3> <p>城市:{{ $room->city }}</p> <p>房型:{{ $room->room_type }}</p> <p>价格:{{ $room->price }} 元/晚</p> </div> @endforeach </div> <!-- 分页链接,保留筛选参数 --> <div class="pagination"> {{ $rooms->appends($request->all())->links() }} </div>
这里的appends($request->all())非常重要,它会把当前的筛选参数(比如city、room_type)附加到分页链接上,避免用户点击下一页时丢失筛选条件。
额外小贴士
- 如果需要支持更多复杂筛选(比如价格区间),只需要在表单里添加对应字段,然后在控制器里扩展查询逻辑即可
- 可以把筛选逻辑封装到模型的作用域(Scope)里,让控制器代码更简洁,比如在
Room模型里定义:
public function scopeCity($query, $city) { return $query->where('city', $city); } public function scopeRoomType($query, $type) { return $query->where('room_type', $type); }
然后控制器里就可以写成:
$query->when($request->city, fn($q) => $q->city($request->city)) ->when($request->room_type, fn($q) => $q->roomType($request->room_type));
内容的提问来源于stack exchange,提问作者Erik180486
相关产品推荐
相关产品推荐

