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

Statamic控制器中实现多where条件及orWhere查询的解决方法

Laravel 控制器多 where 条件查询实现方案

你提供的示例代码存在两处明显问题:

  • 闭包不能直接传入$request参数,需要通过use()语法引入外部变量
  • get()查询执行方法不能写在where闭包内部,需要放在所有条件拼接完成后的链式调用末尾

修正后的示例分组模糊查询写法:

// 提前提取查询关键字,避免重复调用请求方法
$searchKeyword = $request->get('q');

$query = $query->where(function ($q) use ($searchKeyword) {
    $q->where('product_name', 'like', "%{$searchKeyword}%")
      ->orWhere('product_id', 'like', "%{$searchKeyword}%");
});

// 所有条件拼接完成后再执行查询获取结果
$productList = $query->get();

常见多where条件使用场景

1. 固定and条件拼接

直接链式调用where方法即可,默认多个where之间是and逻辑关系:

// 查询状态为上架、库存大于0、对应分类的商品
$query = $query->where('status', 1)
               ->where('stock', '>', 0)
               ->where('category_id', $request->category_id);

2. 可选动态条件拼接

如果部分where条件仅在请求携带对应参数时才生效,用when方法实现更简洁,无需写大量if判断:

$query = $query
    // 分类参数存在时才加分类筛选条件
    ->when($request->has('category_id'), function ($q) use ($request) {
        $q->where('category_id', $request->category_id);
    })
    // 最低价格参数存在时才加价格筛选条件
    ->when($request->has('min_price'), function ($q) use ($request) {
        $q->where('price', '>=', $request->min_price);
    });

3. and、or混合逻辑分组

如果需要同时用到and和or逻辑,必须用闭包将or条件包裹成分组,避免SQL逻辑错误:
比如要实现「查询上架、库存充足,且名称或商品ID匹配关键字的商品」,正确写法如下:

$searchKeyword = $request->get('q');
$products = Product::query()
    ->where('status', 1)
    ->where('stock', '>', 0)
    // 分组包裹or条件,对应SQL中加括号
    ->where(function ($q) use ($searchKeyword) {
        $q->where('product_name', 'like', "%{$searchKeyword}%")
          ->orWhere('product_id', 'like', "%{$searchKeyword}%");
    })
    ->get();

上述代码生成的SQL逻辑为:select * from products where status = 1 and stock > 0 and (product_name like '%关键字%' or product_id like '%关键字%'),符合业务预期。如果不用闭包分组,SQL逻辑会变成status = 1 and stock >0 and product_name like '%关键字%' or product_id like '%关键字%',逻辑完全错误。

内容的提问来源于stack exchange,提问作者user15568390

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:42:02