PSQL查询转Laravel Eloquent Builder语句结果异常问题排查
问题根源
你有两处核心写法错误:
- bar字段的筛选逻辑错误
原生SQL里bar是bar='x' OR bar='y'的或关系,但你在闭包里写的两个where是且关系,要求bar同时等于两个不同的值,该条件永远不会成立。 - 顶层逻辑分组错误
原生SQL三个筛选条件是并列的且关系:foo='abc'AND(bar条件)ANDid排除条件,但你用了顶层的orWhere,会把逻辑拆成(foo='abc' AND id排除) OR (bar条件),运算符优先级完全混乱。你后续调整whereNotIn的调用位置也没有解决这个逻辑优先级问题,所以结果依然不符合预期。
正确的写法
DB::table("example") ->where("example.foo", "=", "abc") // 把bar的或条件作为一个整体和其他条件做AND关联 ->where(function ($query) { $query->where("example.bar", "=", "x") ->orWhere("example.bar", "=", "y"); }) ->whereNotIn("example.id", $array_of_ids) ->distinct() ->select("example.id");
上述代码生成的SQL会完全匹配你给出的原生PSQL语句,返回符合预期的结果。
内容的提问来源于stack exchange,提问作者pickle
相关产品推荐
相关产品推荐

