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

Laravel 5.5中如何在请求参数存在时添加Where条件

解决Laravel查询构建器返回Builder实例而非分页结果的问题

你遇到的问题核心很明确:没有将分页查询的结果赋值给变量,导致$tours始终是查询构建器(Builder)实例,而非执行查询后的分页数据。下面给你一步步梳理解决方案:

1. 核心问题修正

你当前代码的最后一行是:

$tours->paginate(10);

这行代码只是触发了分页查询,但没有把返回的分页结果(LengthAwarePaginator实例)保存到变量中。你需要把结果重新赋值给$tours:

$tours = $tours->paginate(10);

2. 优化条件判断(可选但推荐)

你原来用一堆if判断参数是否存在再添加where条件,Laravel提供了更简洁的when()方法来做这件事,同时用$request->filled()替代!= ''会更严谨(它会同时检查参数是否存在且不为空)。优化后的代码如下:

// 先获取城市uuid数组(这部分你的代码没问题)
$cities = Pocities::where('region_id', $state_id)
    ->where('is_active', 1)
    ->pluck('uuid')->toArray();

// 重构后的Tour查询
$tours = Tour::select(['id', 'uuid','city_uuid', 'tour_name', 'tour_image', 'is_top_tour','places', 'created_at'])
    ->with([
        'pocity' => function ($query) {
            $query->select('id', 'uuid', 'cities_id', 'region_id', 'country_id');
        },
        'pocity.city',
        'pocity.poregion',
        'pocity.pocountry'
    ])
    ->whereHas('pocity', function ($query) use ($cities) {
        $query->whereIn('uuid', $cities);
    })
    ->where('is_active', 1) // 这里你原来的where('is_active')缺少值,补充为1(根据业务逻辑调整)
    // 用when动态添加条件
    ->when($request->filled('name'), function ($query) use ($request) {
        $query->where('name', $request->name);
    })
    ->when($request->filled('id'), function ($query) use ($request) {
        $query->where('id', $request->id);
    })
    ->when($request->filled('type'), function ($query) use ($request) {
        $query->where('type', $request->type);
    })
    ->paginate(10);

3. 额外注意点

  • 你原来的->where('is_active');缺少第二个参数,这会导致Laravel把它当成whereNull('is_active')来处理,显然不符合你的业务逻辑,所以补充为->where('is_active', 1)。
  • 现在$tours就是包含分页数据的实例了,你可以直接在视图中使用它的分页方法(比如$tours->links()来渲染分页链接)。

内容的提问来源于stack exchange,提问作者Abid Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:47:06