Laravel 10控制器多Where子句搜索返回空集合问题解决
多字段搜索查询解决方案
你之前用多Where子句返回空集合,核心原因是默认的where是AND逻辑——要求title、description、intro三个字段同时包含搜索关键词才会返回结果,这种场景几乎很难匹配到数据。正确的做法是使用OR逻辑,只要任意一个字段匹配关键词就返回结果。
以下是几种Laravel框架下的实现方式(替换YourModel为你实际的模型类,比如Post/Article):
方式一:链式调用orWhere
直接通过orWhere串联多个字段的匹配条件:
// 获取搜索框输入的关键词 $keyword = request()->get('search'); // 构建多字段搜索查询 $items = YourModel::where('title', 'like', "%{$keyword}%") ->orWhere('description', 'like', "%{$keyword}%") ->orWhere('intro', 'like', "%{$keyword}%") ->get();
方式二:用whereRaw简化多字段查询
如果需要搜索的字段较多,whereRaw写法更简洁,且Laravel会自动处理参数绑定,避免SQL注入:
$keyword = request()->get('search'); $items = YourModel::whereRaw( "title like ? or description like ? or intro like ?", ["%{$keyword}%", "%{$keyword}%", "%{$keyword}%"] )->get();
方式三:结合when处理空搜索场景
如果用户未输入关键词时不想返回全表数据,可以用when做条件判断,同时用闭包包裹orWhere避免和其他查询条件冲突:
$keyword = request()->get('search'); $items = YourModel::query() ->when($keyword, function ($query) use ($keyword) { return $query->where(function ($subQuery) use ($keyword) { $subQuery->where('title', 'like', "%{$keyword}%") ->orWhere('description', 'like', "%{$keyword}%") ->orWhere('intro', 'like', "%{$keyword}%"); }); }) ->get();
将最终得到的$items变量传递到search.blade.php中渲染即可。
内容的提问来源于stack exchange,提问作者tooManyDivs
相关产品推荐
相关产品推荐

