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

Laravel 9多条件搜索功能异常,请求修复方案

Laravel 9 多条件搜索功能修复方案

问题分析

你的代码主要存在以下几个问题导致筛选功能异常:

  • 逻辑运算符错误:使用orWhere/orWhereBetween会让条件间变成「或」关系,而非需求的「且」关系,多条件同时输入时无法精准匹配。
  • 冗余排序语句:多次重复调用orderBy,属于不必要的冗余操作。
  • 缺少参数校验:未验证用户是否至少填写一个筛选参数,无输入时会返回全部数据,不符合需求。
  • 潜在SQL注入风险:直接字符串拼接筛选值存在安全隐患。

修复后的代码

public function fotoTrxSearch(Request $request)
{
    // 验证字段格式合法性
    $request->validate([
        'name' => 'nullable|string',
        'from' => 'nullable|date',
        'to' => 'nullable|date|after_or_equal:from',
        'price' => 'nullable|numeric',
        'folder' => 'nullable|string',
    ], [
        'to.after_or_equal' => '结束日期不能早于开始日期',
    ]);

    // 检查是否至少填写一个筛选参数
    $hasFilter = $request->filled(['name', 'from', 'to', 'price', 'folder']);
    if (!$hasFilter) {
        // 可根据需求返回提示或空分页数据,示例返回空分页
        $result = new FotoCollection(Foto::orderByDesc('id')->paginate(50));
        return Inertia::render('Foto/FotoList', ['fotos' => $result]);
        // 若需要抛出错误提示,可替换为:
        // return back()->withErrors(['filter' => '至少需要填写一个筛选参数']);
    }

    $transaction = Foto::orderByDesc('id');

    if ($request->filled('name')) {
        $transaction->where('name', 'like', "%{$request->name}%");
    }

    // 日期范围使用whereBetween,保证逻辑为「且」
    if ($request->filled('from') && $request->filled('to')) {
        $transaction->whereBetween('date', [$request->from, $request->to]);
    }

    if ($request->filled('price')) {
        // 若价格为精确匹配,建议改为where('price', $request->price)以提升效率
        $transaction->where('price', 'like', "%{$request->price}%");
    }

    if ($request->filled('folder')) {
        $transaction->where('folder', 'like', "%{$request->folder}%");
    }

    $result = new FotoCollection($transaction->paginate(50));

    return Inertia::render('Foto/FotoList', ['fotos' => $result]);
}

关键优化点

  1. 逻辑修正:将所有orWhere改为where,确保多条件同时满足时才返回结果;日期范围查询使用whereBetween替代orWhereBetween。
  2. 参数校验:添加字段格式验证,同时检查是否至少提交一个筛选参数,避免无筛选时返回全部数据。
  3. 排序优化:仅保留初始的orderByDesc('id'),移除重复的排序语句。
  4. 安全保障:Laravel查询构建器会自动转义请求参数,避免SQL注入风险;若价格为精确筛选,建议使用直接匹配替代模糊查询,提升查询效率。

内容的提问来源于stack exchange,提问作者shinichirou ikebe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:27:40