Laravel 5.4:如何将过滤查询默认设置为显示全部数据?
解决Laravel查询中条件参数可选的问题
嘿,这个需求太常见了,Laravel的查询构建器刚好提供了非常优雅的解决方案,不用写一堆冗余判断就能实现「参数存在才过滤,不存在就返回全部」的逻辑。
方法一:使用when()方法(推荐)
when()是Laravel专门用来处理条件查询的工具,它会自动判断第一个参数是否为真,只有满足条件时才执行后面的闭包逻辑,完全适配你的场景:
public function index(Request $request) { $dateFrom = $request->get('dateFrom', Carbon::now()->subYears(10)->toDateTimeString()); $dateTo = $request->get('dateTo', Carbon::today()); $status = $request->get('orderState'); $orders = (new OrderDetail()) ->where('supplier_id', Auth::guard('supplier')->user()->id) ->whereBetween('created_at', [$dateFrom, $dateTo]) // 仅当$status存在且有效时,添加订单状态过滤 ->when($status, function ($query) use ($status) { return $query->whereHas('orderId', function ($que) use ($status) { // 这里替换成你实际的订单状态字段名,比如`state`或`status` $que->where('state', $status); }); }) ->get(); // 别忘了调用get()获取最终结果 // 根据业务需求返回数据,比如JSON或视图 return response()->json($orders); }
更严谨的参数判断:
如果需要区分「参数未传入」和「参数传入了空值」,可以用$request->filled('orderState')代替直接判断$status:
->when($request->filled('orderState'), function ($query) use ($request) { $status = $request->orderState; return $query->whereHas('orderId', function ($que) use ($status) { $que->where('state', $status); }); })
filled()会检查参数确实存在且不为空字符串、null或空白字符,能避免意外的过滤逻辑。
方法二:传统的if判断写法
如果你觉得when()不够直观,也可以用基础的if判断手动拼接查询条件,逻辑完全一致:
public function index(Request $request) { $dateFrom = $request->get('dateFrom', Carbon::now()->subYears(10)->toDateTimeString()); $dateTo = $request->get('dateTo', Carbon::today()); $status = $request->get('orderState'); // 先构建基础查询 $ordersQuery = (new OrderDetail()) ->where('supplier_id', Auth::guard('supplier')->user()->id) ->whereBetween('created_at', [$dateFrom, $dateTo]); // 仅当$status有效时,添加状态过滤 if ($request->filled('orderState')) { $ordersQuery->whereHas('orderId', function ($que) use ($status) { $que->where('state', $status); }); } // 执行查询获取结果 $orders = $ordersQuery->get(); return response()->json($orders); }
两种方法都能完美实现你的需求:当用户未传入orderState参数时,查询会自动跳过状态过滤,返回所有符合日期和供应商ID的订单数据;当传入参数时,才会按指定状态过滤。
内容的提问来源于stack exchange,提问作者Yousef Altaf
相关产品推荐
相关产品推荐

