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
相关产品推荐
相关产品推荐

