如何在Laravel同一查询中正确组合whereBetween与orWhere条件?
搞定Laravel查询条件组合的正确姿势
嘿,我来帮你理清楚这个查询条件的组合问题~你提到要结合日期范围和req_id匹配的条件,这里分几种常见场景给你对应的解决方案:
场景1:数据必须同时满足日期范围 + 指定req_id
如果你的需求是筛选出既在目标日期区间内,又匹配某个特定req_id的数据,这时候要用where(逻辑AND)而不是orWhere,代码如下:
$did = DB::table('ssrareqs') ->select('particular_id', 'quantity_req', 'purpose', 'date_applied','date_approved', 'quantity_issued', 'remarks', 'status_issue', 'status_req') ->whereBetween('date_applied', [$start_date, $end_date]) ->where('req_id', $req_id[$i]) // 用where实现「且」的逻辑 ->get();
场景2:数据满足任一条件即可:日期范围 OR 指定req_id
要是你需要的是「要么在日期范围内,要么匹配指定req_id」的数据,直接链式调用orWhere就可以。不过如果后续还要加其他查询条件,记得用闭包把OR条件包起来,避免逻辑混乱:
$did = DB::table('ssrareqs') ->select('particular_id', 'quantity_req', 'purpose', 'date_applied','date_approved', 'quantity_issued', 'remarks', 'status_issue', 'status_req') ->whereBetween('date_applied', [$start_date, $end_date]) ->orWhere('req_id', $req_id[$i]) // 用orWhere实现「或」的逻辑 ->get();
额外补充:如果req_id是多个值的数组
要是你需要匹配req_id数组里的任意一个值,同时还要满足日期范围,直接用whereIn就搞定了:
// 假设$req_id是类似[1, 3, 5]这样的数组 $did = DB::table('ssrareqs') ->select('particular_id', 'quantity_req', 'purpose', 'date_applied','date_approved', 'quantity_issued', 'remarks', 'status_issue', 'status_req') ->whereBetween('date_applied', [$start_date, $end_date]) ->whereIn('req_id', $req_id) // 匹配数组中任意一个req_id,同时满足日期范围 ->get();
重要提醒:混合条件时记得分组
当你同时用where和orWhere的时候,一定要注意逻辑分组。比如你想实现「日期范围 且 (req_id匹配 或 状态为已批准)」,就得用闭包把OR条件包裹起来,不然逻辑会跑偏:
$did = DB::table('ssrareqs') ->select('particular_id', 'quantity_req', 'purpose', 'date_applied','date_approved', 'quantity_issued', 'remarks', 'status_issue', 'status_req') ->whereBetween('date_applied', [$start_date, $end_date]) ->where(function($query) use ($req_id) { $query->where('req_id', $req_id[$i]) ->orWhere('status_req', 'approved'); }) ->get();
这样就能保证括号里的OR条件是和日期范围的AND条件组合,不会出现意料之外的查询结果~
内容的提问来源于stack exchange,提问作者R. Mseti
相关产品推荐
相关产品推荐

