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

Laravel多where与orWhere查询不符合预期问题排查

问题原因及解决方案

你的查询逻辑存在运算符优先级问题,当前代码生成的SQL语句等价于:

SELECT users.*, users.id as user_tab_id
FROM users
WHERE role_id = 2 AND name LIKE '%chase %'
OR first_name LIKE '%chase %'
OR last_name LIKE '%chase %'

由于AND优先级高于OR,实际执行逻辑是**(role_id=2且name匹配) 或者 first_name匹配 或者 last_name匹配**,这就导致了role_id≠2但名字匹配的用户也被筛选出来。

修正后的代码

需要将三个名字匹配的条件用闭包包裹,确保它们在同一个逻辑分组内,和role_id=2形成“且”的关系:

public function search_friend_custom(Request $request) {
    $search = $request->input('search');
    $search = 'chase'; // 注意移除末尾多余的空格,避免搜索不准确
    // ** $Search variable has chase string for searching.**

    $friends = DB::table('users')
            ->select('users.*','users.id as user_tab_id')
            ->where('role_id', 2)
            ->where(function($query) use ($search) {
                $query->where('name', 'like', '%' . $search . '%')
                      ->orWhere('first_name', 'like', '%' . $search . '%')
                      ->orWhere('last_name', 'like', '%' . $search . '%');
            })
            ->paginate(10); 

    return view('user.custom_search' , compact('friends'));
}

修正后生成的SQL会变成:

SELECT users.*, users.id as user_tab_id
FROM users
WHERE role_id = 2 
AND (name LIKE '%chase%' OR first_name LIKE '%chase%' OR last_name LIKE '%chase%')

这样就能保证只筛选出role_id=2且任意名字字段包含“chase”的用户。

另外注意你硬编码的$search = 'chase '末尾有多余空格,这会导致搜索时只匹配包含“chase ”(带空格)的字段,建议移除这个空格,或者根据实际需求处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:33:29