Laravel模型查询检索条件匹配问题(疑似SQL限制相关)
解决Laravel关联模型搜索的逻辑优先级问题
嘿,我猜你现在大概率遇到了查询结果不符合预期的情况——比如返回了不属于当前用户的雇主?这是因为你当前的写法踩了SQL逻辑优先级的常见坑!
咱们先拆解下原查询的问题:Auth::user()->employers()会自动给查询加上employers.user_id = 当前用户ID的关联条件,但后面的orWhere和orWhereHas直接跟在这个条件后,SQL的执行优先级会让逻辑变成:
(employers.user_id = ? AND name like ?) OR 存在匹配的地点 OR 存在匹配的分支
这就意味着,只要某个雇主的地点或分支匹配搜索词,哪怕它不属于当前用户,也会被查出来,显然和你的需求不符。
修正后的查询代码
你需要把所有OR关联的搜索条件包裹在一个闭包里,让它们作为一个整体和用户关联条件做AND逻辑:
Auth::user()->employers() ->where(function($query) use ($filter) { // 把所有需要OR连接的条件放在这个闭包里 $query->where('name', 'like', "%{$filter}%") // 记得加通配符,否则只匹配完全相等的字符串 ->orWhereHas('locations.location', function($subQuery) use ($filter) { $subQuery->where('name', 'like', "%{$filter}%"); }) ->orWhereHas('locations.branches', function($subQuery) use ($filter) { $subQuery->where('name', 'like', "%{$filter}%"); }); }) // 这里可以继续添加其他需要AND连接的条件 ->get();
为什么这样有效?
Laravel会自动给闭包里的条件加上括号,最终生成的SQL逻辑是:
employers.user_id = ? AND (name like ? OR 存在匹配的地点 OR 存在匹配的分支)
这样就确保了只有当前用户的雇主中,满足名称匹配、地点匹配或分支匹配任意一个条件的记录才会被返回,完美贴合你的需求。
另外提醒下:如果你的$filter变量没有预先添加%通配符,一定要补上,否则like查询只会匹配和搜索词完全一致的字符串哦~
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

