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

Laravel如何将多个where子句组合为orWhere查询?

Laravel实现多Where转OrWhere的解决方案(不修改指定函数)

核心思路

利用Laravel查询构造器的闭包分组查询特性,将需要转为OR的条件统一包裹在一个where闭包内。在闭包内部,第一个条件正常调用addPageTypeQuery生成where语句,后续条件通过orWhere嵌套闭包的方式复用原函数,实现OR逻辑。

修改后的代码示例

public function call() 
{
    $pageTypes = ["page_user", "guest_user" /* ...其他类型 */];
    
    // 初始化查询构造器(替换为你实际使用的模型/查询实例)
    $query = YourTargetModel::query();
    
    // 用闭包分组实现OR条件
    $query->where(function ($q) use ($pageTypes) {
        foreach ($pageTypes as $index => $pageType) {
            if ($index === 0) {
                // 第一个条件直接调用原函数生成where
                $this->addPageTypeQuery($q, $pageType);
            } else {
                // 后续条件用orWhere嵌套闭包,复用原函数
                $q->orWhere(function ($subQuery) use ($pageType) {
                    $this->addPageTypeQuery($subQuery, $pageType);
                });
            }
        }
    });
    
    // 执行查询并获取结果
    $result = $query->get();
}

public function addPageTypeQuery($query, $pageType)
{
    return $query->where('page_type', 'LIKE', $pageType);
}

原理说明

  • 闭包分组where(function($q) { ... })会生成一对括号包裹内部的所有条件,确保OR逻辑只作用于这组条件,不会干扰查询中的其他AND条件。
  • 第一个条件直接调用原函数生成WHERE page_type LIKE ?,后续每个条件通过orWhere(function($subQ) { ... })生成OR (page_type LIKE ?),最终组合成(page_type LIKE ? OR page_type LIKE ?)的SQL片段。
  • 全程无需修改addPageTypeQuery函数,也不需要使用whereIn,完全适配你的环境限制。

内容的提问来源于stack exchange,提问作者Mr. Kenneth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:25:08