如何使用laravel按日期过滤记录?

时间:2021-06-07 13:58:06

标签: php laravel

我有一个这样的过滤器

filter

我有一个带有 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'));
}

2 个答案:

答案 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,这从可用性的角度来看是完全可能的。

创建一个查询构建器,然后为 wherestart_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);
相关问题