Laravel - Поиск между датами выпуска - PullRequest
2 голосов
/ 28 июня 2019

Я пытаюсь использовать фильтр даты в Laravel.Все работает нормально, за исключением того факта, что если start_date и end_date имеют одинаковую дату.Тогда это не даст никакого результата, кроме как когда я увеличу на 1.

    public function userresponseReport(Request $request)
{
    $data['title'] = 'User Response';

    $userresponses = DB::table('user_response as g')
    ->select(
       DB::raw('DATE(g.created_at) as created_date'),
       'g.msisdn', 
       'g.game_code', 
       'g.answer',
       'g.answer_code',
       'g.Amount_charged',
       'g.payment_ref',
       'g.status',
       'g.user_channel'                
  )               
 ->orderByRaw('g.created_at DESC'); 

    $render=[];  
    if(isset($request->start_date) && isset($request->end_date))
    {
        $userresponses=$userresponses->whereBetween('created_at',[$request->start_date,$request->end_date]);

        $render['start_date']=$request->start_date;
        $render['end_date']=$request->end_date;
    }elseif(isset($request->start_date))
    {
        $userresponses=$userresponses->where('created_at',$request->start_date);
        $render['start_date']=$request->start_date;
    }                
    $userresponses= $userresponses->orderBy('created_at','DESC');
    $userresponses= $userresponses->paginate(15);
    $userresponses= $userresponses->appends($render);
    $data['userresponses'] = $userresponses;

return view('report.userresponseReport',$data);        
}

Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Вы можете использовать whereDate() с >= и <= операторами. Обратите внимание, что метод whereDate() извлекает часть даты из выражения datetime. Таким образом, на ту же дату запрос вернет все регистры created_at на эту дату.

$date_from = $request->start_date;
$date_to = $request->end_date;
$render=[];
$userresponses = DB::table('user_response as g')
    ->select(
       // ...               
  )               
 ->orderByRaw('g.created_at DESC')
 ->when($date_from, function($query) use ($date_from, $render) {
     $render['start_date'] = $date_from;
     $query->whereDate('created_at', '>=', $date_from);
 })
 ->when($date_to, function($query) use ($date_to, $render) {
     $render['end_date'] = $date_to;
     $query->whereDate('created_at', '<=', $date_to);
 })
 ->orderBy('created_at','DESC')
 ->paginate(15);

Если вы хотите сравнить дату и время, используйте where(). И то же самое, вы можете решить проблему "если start_date и end_date не совпадают в одну и ту же дату" с операторами <= и >=.

 // ...
 ->when($date_from, function($query) use ($date_from, $render) {
     $render['start_date'] = $date_from;
     $query->where('created_at', '>=', $date_from);
 })
 ->when($date_to, function($query) use ($date_to, $render) {
     $render['end_date'] = $date_to;
     $query->where('created_at', '<=', $date_to);
 })

Но было бы очень трудно найти запись с даты-времени "2019-06-28 14:44:44" до той же даты-времени, она вернула бы что-то, только если запись была создана в эту точную секунду.

0 голосов
/ 28 июня 2019

Если даты начала и окончания совпадают, вы все равно хотите вернуть результат?

Вы можете использовать orWhere.

$userresponses->whereBetween('created_at',[$request->start_date,$request->end_date])
->orWhere('created_at', '=', $request->start_date)
->orWhere('created_at', '=', $request->end_date);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...