You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:28:40