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
相关产品推荐
相关产品推荐

