我有一个这样的过滤器
我有一个带有 Laravel 的工作日期过滤器。问题是,如果我在没有显示记录时不过滤我的记录。
public function index(Request $request)
{
$stats = [
'done' => UserTransaction::where('status', UserTransaction::STATUS['done'])->count(),
'canceled' => UserTransaction::where('status', UserTransaction::STATUS['canceled'])->count(),
'all' => UserTransaction::count(),
];
if ($request->start_date && $request->end_date){
$dateS = new Carbon($request->start_date);
$dateE = new Carbon($request->end_date);
$result = UserTransaction::whereBetween('created_at', [$dateS->format('Y-m-d'), $dateE->format('Y-m-d')])->get();
}
if ($request->search) {
$transactions = UserTransaction::search($request->search)->paginate(5);
} else {
$transactions = UserTransaction::paginate(5);
}
if ($transactions->count() == 0 && $request->search ) {
msg()->warning('No records found');
}
return view('transaction::admin.index', compact('transactions', 'stats', 'result'));
}
答案 0 :(得分:1)
您可以在查询中使用 if 条件并删除外部 if 条件
$result = UserTransaction::where(function($query)use($request){
if(!empty($request->start_date)&&!empty($request->end_date)){
$dateS = new Carbon($request->start_date);
$dateE = new Carbon($request->end_date);
$query->whereBetween('created_at', [$dateS->format('Y-m-d'), $dateE->format('Y-m-d')]);
}
})->get();
答案 1 :(得分:1)
我会考虑稍微改变你的逻辑,让人们指定一个 start date
或一个 end date
,这从可用性的角度来看是完全可能的。
创建一个查询构建器,然后为 where
和 start_date
添加 end_date
子句(如果它们出现在您的 $request
对象中)。如果它们没有出现,那么您可以像之前一样使用该查询。
$transactions = Transaction::query();
if ($request->start_date) {
$query->whereDate('start_date', '>=', new Carbon($request->start_date));
}
if ($request->end_date) {
$query->whereDate('end_date', '<=', new Carbon($request->end_date));
}
if ($requer->search) {
$query->search($request->search);
}
$query->paginate(5);