Laravel多条件搜索仅填单个字段时返回全部记录如何修复?
问题原因
- 控制器查询未做非空判断:当搜索字段为空时,
LIKE "%%"会匹配该字段所有值,加上orWhere的连接逻辑,只要有一个空字段的条件匹配所有,最终就会返回全部记录。 - 前端下拉框默认选项无空值:未选择变速箱类型时,默认提交的value为文本"Transmission",会触发无效的匹配逻辑。
- 表单属性笔误:原代码中
form标签的type="get"应为method="get",否则提交方式会默认走POST请求。
修复代码
控制器代码修正
使用Laravel自带的when条件查询方法,仅当对应搜索参数不为空时,才把查询条件加到SQL语句中:
public function multiSearch(Request $request){ $searchParams = $request->only(['search', 'search_1', 'search_2']); $cars = Car::query() // 价格参数不为空时才加查询条件 ->when(!empty($searchParams['search']), function ($query) use ($searchParams) { return $query->where('price', 'LIKE', "%{$searchParams['search']}%"); }) // 车型年份参数不为空时才加查询条件 ->when(!empty($searchParams['search_1']), function ($query) use ($searchParams) { // 如需多个条件同时满足,把下面的orWhere改成where即可 return $query->orWhere('model', 'LIKE', "%{$searchParams['search_1']}%"); }) // 变速箱参数不为空时才加查询条件 ->when(!empty($searchParams['search_2']) && $searchParams['search_2'] != 'Transmission', function ($query) use ($searchParams) { // 如需多个条件同时满足,把下面的orWhere改成where即可 return $query->orWhere('transmission', 'LIKE', "%{$searchParams['search_2']}%"); }) ->get(); return view('car.car-multisearch', ['cars'=>$cars]); }
Blade模板代码修正
修正表单属性、下拉框默认值,同时增加搜索后内容回显,提升使用体验:
<form method="get" action="{{url('/search-car')}}"> @csrf <div class="row"> <div class="col-md-4"> <p> <input type="text" name="search" placeholder="Price" value="{{ request('search', '') }}" /> </p> </div> <div class="col-md-4"> <p> <input type="text" name="search_1" placeholder="Model Year" value="{{ request('search_1', '') }}" /> </p> </div> <div class="col-md-4"> <p> <select name="search_2"> <option value="" data-display="Transmission" {{ request('search_2') == '' ? 'selected' : '' }}>Transmission</option> <option value="Automatic" {{ request('search_2') == 'Automatic' ? 'selected' : '' }}>Automatic</option> <option value="Manual" {{ request('search_2') == 'Manual' ? 'selected' : '' }}>Manual</option> </select> </p> </div> <button type="submit" class="gauto-theme-btn">Find Car</button> </div> </form>
内容的提问来源于stack exchange,提问作者Salamah Salamah
相关产品推荐
相关产品推荐

