Laravel多条件搜索表单字段为空时返回空数组如何解决
问题核心原因
你现有代码的问题主要来自4点:
- 条件分支覆盖不全:只写了3种筛选参数的组合判断,其余参数组合要么触发全量查询要么返回空结果
- 逻辑运算符错误:使用
&位运算符替代了&&逻辑与运算符,判断结果完全不符合预期 - 筛选结果被覆盖:后续的排序逻辑每次都重新初始化
Product查询,直接丢弃了前面的筛选条件 - 空值转换异常:空的价格参数强制转float后会变成0,导致
whereBetween匹配不到符合要求的产品
修复方案
直接使用Laravel内置的when()条件查询方法实现动态筛选,无需手动写大量if分支判断参数是否存在,修复后的控制器代码如下:
public function all_products(Request $request){ // 初始化产品查询构造器 $productQuery = Product::query(); // 标题关键词筛选:参数非空才生效 $productQuery->when($request->filled('q'), function ($query) use ($request) { return $query->where('title_'.App::getLocale(), 'like', '%'.$request->q.'%'); }); // 分类筛选:参数非空才生效 $productQuery->when($request->filled('category_search'), function ($query) use ($request) { return $query->where('sub_category_id', $request->category_search); }); // 价格区间筛选:两个价格都非空才生效 $productQuery->when($request->filled('from_price') && $request->filled('to_price'), function ($query) use ($request) { return $query->whereBetween('price', [ (float)$request->from_price, (float)$request->to_price ]); }); // 排序逻辑:直接在现有查询基础上拼接,不会丢失筛选条件 $sortType = $request->get('sort'); switch($sortType) { case 'price_asc': $productQuery->orderBy('price', 'asc'); break; case 'price_desc': $productQuery->orderBy('price', 'desc'); break; case 'newest': $productQuery->orderBy('created_at', 'desc'); break; default: $productQuery->orderBy('views', 'desc'); }; // 统一分页:有筛选条件时每页6条,无筛选时每页8条,和原有逻辑保持一致 $isFiltered = $request->hasAny(['q', 'category_search', 'from_price', 'to_price']); $products = $productQuery->paginate($isFiltered ? 6 : 8); // 其余原有查询逻辑不变 $cats = Category::orderBy('id','asc')->paginate(3); $cat = Category::all(); $setting = Setting::first(); $country = Country::with('city')->get(); return view('all',compact('products','cats','cat','setting','country')); }
如果需要保留视图里价格输入框默认的1和10000作为兜底值,即使用户清空输入也按默认值筛选价格,可以把价格筛选部分改成如下逻辑:
// 给价格参数加默认值 $from_price = $request->filled('from_price') ? (float)$request->from_price : 1; $to_price = $request->filled('to_price') ? (float)$request->to_price : 10000; $productQuery->whereBetween('price', [$from_price, $to_price]);
内容的提问来源于stack exchange,提问作者Moataz X9
相关产品推荐
相关产品推荐

