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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:52:42