Laravel 10中如何在where闭包内保留orWhereIn条件?
Laravel 10嵌套查询中保留闭包内的OR条件组合
你遇到的是Laravel查询构建器的默认行为:当外部使用where(AND逻辑)时,闭包内的第一个条件会自动继承外部的AND运算符,直接写orWhereIn会被覆盖为whereIn,导致原本的OR组合变成AND组合。
要让闭包内的条件保持OR逻辑分组,只需调整闭包内的写法:
正确写法:用where开头,后续用orWhereIn
如果闭包里有多个OR条件,把第一个条件改成whereIn,后面的用orWhereIn,Laravel会自动将闭包里的条件分组为OR组合:
// 示例:匹配prop1在$values1 或者 prop2在$values2,同时满足外部的AND条件 $product->where('category_id', 1) ->where(function ($query) use ($values1, $values2) { $query->whereIn('prop1', $values1) ->orWhereIn('prop2', $values2); });
生成的SQL会是:
SELECT * FROM products WHERE category_id = 1 AND (prop1 IN (?, ?, ...) OR prop2 IN (?, ?, ...))
如果只有单个OR条件(即仅一个orWhereIn)
这种情况下,whereIn和orWhereIn在闭包里生成的SQL逻辑是等价的(AND (value IN (...)) 和 AND value IN (...) 效果一致)。但如果你非要在SQL里显式保留OR结构(虽然没必要),可以用嵌套闭包强制生成OR分组:
$product->where('category_id', 1) ->where(function ($query) use ($values) { $query->where(function ($subQuery) use ($values) { $subQuery->orWhereIn('properties.value', $values); }); });
核心原因
Laravel的查询构建器会让闭包的第一个条件继承外部的逻辑运算符(外部是where则用AND,外部是orWhere则用OR)。所以只要闭包内第一个条件用where开头,后续的orWhere...就会保持OR逻辑,最终形成AND (A OR B OR ...)的分组效果。
内容的提问来源于stack exchange,提问作者Qasem Salehy
相关产品推荐
相关产品推荐

