我使用以下查询来获取start date
和end date
之间存在的记录:
$event =Event::whereBetween('date', [
$request->start_date, $request->end_date
])->orderBy('date', 'desc')->paginate(5);
当我提供开始日期和结束日期时,这是工作的,但是,当我只提供开始日期时,那么我没有得到任何记录-但我想要在开始日期之后存在的记录,如果结束日期保持空白。
有什么建议吗?
Laravel为这个用例提供了条件子句
$events = Event::query()
->when(
$request->has('start_date') && $request->has('end_date'),
function($query, $request) {
return $query->whereBetween('date', [
$request->start_date, $request->end_date
]);
},
function($query, $request) {
return $query->where('date', ' >=', $request->start_date);
}
)
->orderBy('date', 'desc')
->paginate(5);
@babak-asharfi答案的两个备选方案
使用when()
$event = Event::when($request->end_date,
function($query) use ($request) {
$query->whereBetween('date', $request->start_date, $request->end_date);
},
function($query) use ($request){
$query->where('date', '=>', $request->start_date);
}
)->orderBy('date', 'desc')->paginate(5);
或者直接使用备用日期
$event = Event::whereBetween('date', [
$request->start_date, $request->end_date ?: '2999-12-31'
])->orderBy('date', 'desc')->paginate(5);
可以使用下面的代码
$query = Event::query();
if ($request->has('start_date')){
$query->whereBetween('date', [
$request->start_date, $request->end_date
])
}else{
$query->where('date', '>=', $request->start_date)
}
$query->orderBy('date', 'desc')->paginate(5);