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

Laravel 10多参数关联搜索改造:实现多条件精准匹配查询

需求背景与现有代码

当前搜索功能仅支持单参数匹配(例如输入某城市即可返回该城市的所有记录),需要改造为支持多参数同时匹配(例如输入「城市+街道」,返回同时符合该城市和街道条件的所有记录)。运行环境为Laravel 10(不使用Laravel Scout)、PHP 8.2,现有搜索代码如下:

public function search(Request $request){        
        $search = $request->search;

        $resorts = Resort::where(function($query) use ($search){
            // query to main table
            $query->where('name', 'like', "%$search%")
            ->orWhere('city', 'like', "%$search%")
            ->orWhere('street', 'like', "%$search%")
            ->orWhere('home_number', 'like', "%$search%");
            
            //->orWhere('description' 'like', "%$search%"); 
        })
        //query with foreign key
        ->orWhereHas('voivodeship',function($query) use ($search){
            $query->where('name', 'like', "%$search%");
        })
        ->get();

        return view('index',compact('resorts', 'search'));
    }
改造实现方案

核心思路

将用户输入的搜索内容按空格拆分为多个独立关键词,要求所有关键词必须在指定字段(或关联模型字段)中匹配,以此实现多参数的同时匹配逻辑。

改造后代码

public function search(Request $request)
{
    $search = $request->input('search', '');
    // 拆分关键词,过滤空字符串(处理连续空格的情况)
    $keywords = array_filter(explode(' ', $search));

    $resorts = Resort::query();

    if (!empty($keywords)) {
        foreach ($keywords as $keyword) {
            $escapedKeyword = "%{$keyword}%";
            $resorts->where(function ($query) use ($escapedKeyword) {
                // 主表字段匹配:当前关键词需匹配任意一个主表字段
                $query->where('name', 'like', $escapedKeyword)
                      ->orWhere('city', 'like', $escapedKeyword)
                      ->orWhere('street', 'like', $escapedKeyword)
                      ->orWhere('home_number', 'like', $escapedKeyword)
                      // 关联表字段匹配:当前关键词匹配voivodeship的name字段
                      ->orWhereHas('voivodeship', function ($subQuery) use ($escapedKeyword) {
                          $subQuery->where('name', 'like', $escapedKeyword);
                      });
            });
        }
    }

    $resorts = $resorts->get();

    return view('index', compact('resorts', 'search'));
}

代码说明

  1. 关键词拆分:使用explode(' ', $search)将输入内容按空格拆分,再用array_filter过滤掉拆分后产生的空字符串(避免用户输入连续空格导致无效查询)。
  2. 多条件AND逻辑:通过foreach遍历每个关键词,每个关键词都嵌套一层where闭包,确保所有关键词的匹配条件都被满足(外层where默认是AND关系)。
  3. 字段匹配逻辑:每个关键词内部,依然保留原有的orWhere逻辑——即该关键词只需匹配主表任意一个字段,或关联模型的name字段即可。
  4. 空搜索处理:如果用户未输入任何有效关键词,会返回所有Resort记录,可根据需求调整(比如改为返回空集合)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:57:31