[英]How to filter records by date with laravel?
我有一個像這樣的過濾器
我有一個帶有 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'));
}
您可以在查詢中使用 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();
我會考慮稍微更改您的邏輯,以允許人們僅指定start date
或僅指定end date
,這從可用性的角度來看是完全可能的。
創建一個查詢生成器,然后為start_date
和end_date
添加where
子句(如果它們出現在您的$request
object 中)。 如果它們沒有出現,那么您可以使用該查詢,因為您已經這樣做了。
$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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.