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
相关产品推荐
相关产品推荐

