Laravel多条件搜索(orWhere/orWhereHas)过滤失效问题求助
问题分析与解决方案
你的问题核心是逻辑运算符优先级导致的筛选失效:初始设置的percentage=50条件,只有和第一个where('place_id', ...)是AND关系,后续的orWhere/orWhereHas会直接绕过percentage限制,只要满足任意一个OR条件就会返回结果。
原因说明
SQL中AND的优先级高于OR,你原代码生成的SQL逻辑是:
WHERE percentage = '50' AND place_id LIKE '%xxx%' OR place_name LIKE '%xxx%' OR address LIKE '%xxx%' ...
这意味着只要后面任意一个OR条件匹配,不管percentage是不是50都会被查询出来,只有place_id的筛选会和percentage绑定生效。
修正代码
把所有搜索条件包裹在一个where闭包内,让整个搜索逻辑成为一个整体,和外层的percentage=50保持AND关系:
$assetSurvey = new AssetSurvey(); $workInProgressSurvey = $assetSurvey->where('percentage', '50'); $survey = $workInProgressSurvey->when($search, function ($query, $search) { // 用闭包包裹所有搜索条件,确保和外层percentage条件是AND关系 $query->where(function ($subQuery) use ($search) { $subQuery->where('place_id', 'like', '%'.$search.'%') ->orWhere('place_name', 'like', '%'.$search.'%') ->orWhere('address', 'like', '%'.$search.'%') ->orWhereHas('client', function ($query) use ($search) { $query->where('description', 'like', '%'.$search.'%'); })->orWhereHas('state', function ($query) use ($search) { $query->where('description', 'like', '%'.$search.'%'); })->orWhereHas('organization', function ($query) use ($search) { $query->where('name', 'like', '%'.$search.'%'); }); }); })->offset(($page - 1) * $paginate) ->paginate($paginate); return response()->json($survey);
修正后的SQL逻辑
WHERE percentage = '50' AND ( place_id LIKE '%xxx%' OR place_name LIKE '%xxx%' OR address LIKE '%xxx%' ... )
这样就保证了所有返回的记录必须同时满足percentage=50和任意一个搜索条件。
内容的提问来源于stack exchange,提问作者Lea
相关产品推荐
相关产品推荐

