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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:42:20