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

Laravel多条件搜索表单字段为空时返回空数组如何解决

问题核心原因

你现有代码的问题主要来自4点:

  1. 条件分支覆盖不全:只写了3种筛选参数的组合判断,其余参数组合要么触发全量查询要么返回空结果
  2. 逻辑运算符错误:使用&位运算符替代了&&逻辑与运算符,判断结果完全不符合预期
  3. 筛选结果被覆盖:后续的排序逻辑每次都重新初始化Product查询,直接丢弃了前面的筛选条件
  4. 空值转换异常:空的价格参数强制转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:06:04