Как я могу выполнить поиск конкретной записи продолжительностью 2 даты в laravel?

#php #laravel #mongodb #eloquent

#php #laravel #mongodb #красноречивый

Вопрос:

На моей странице запроса на отпуск у меня есть одна строка поиска в столбце продолжительность отпуска, в столбце продолжительность отпуска указаны даты, первая — дата начала отпуска, а вторая — дата окончания отпуска.

Я хочу сделать это в строке поиска, если я напишу дату между ними, чем я получу вывод этой записи. Моя база данных — mongodb

значение leavedate является переменной, с помощью которой я нахожу записи.

Вот код моего файла контроллера

  public function listOfLeave(Request $request)
    {


        $allLeaves = null;
        if (
            !empty($request->input('name')) || 
            !empty($request->input('leaveType')) ||
            !empty($request->input('leaveDate')) ||
            !empty($request->input('appliedDate')) || 
            !empty($request->input('status'))       
        )
        {
            $flg = false; 

            if (!empty($request->input('name')))
            {
                $flg = true; 
                $allLeaves=LeaveManagement::where('name', 'LIKE', "%{$request->input('name')}%");
            }

            if (!empty($request->input('leaveType')))
            {
                if($flg)
                {
                    $allLeaves=$allLeaves->orWhere('type', 'LIKE', "%{$request->input('leaveType')}%");
                }
                else 
                {
                    $allLeaves=LeaveManagement::where('type', 'LIKE', "%{$request->input('leaveType')}%");
                }
            }



            if (!empty($request->input('leaveDate'))) 
            {
                if ($flg) 
                {
                    $allLeaves = $allLeaves->orWhere('end', '>=', $request->input('leaveDate'))
                                            ->orWhere('start', '<=', $request->input('leaveDate'));
                } 
                else 
                {
                    $allLeaves = LeaveManagement::where('end', '>=', $request->input('leaveDate'));
                }
            }

            if (!empty($request->input('appliedDate')))
            {
                if($flg)
                {
                    $allLeaves=$allLeaves->orWhere('start', 'LIKE', "%{$request->input('appliedDate')}%");
                }
                else 
                {
                    $allLeaves=LeaveManagement::where('start', 'LIKE', "%{$request->input('appliedDate')}%");
                }
            }

            if (!empty($request->input('status')))
            {
                if($flg)
                {
                    $allLeaves=$allLeaves->orWhere('status', 'LIKE', "%{$request->input('status')}%");
                }
                else 
                {
                    $allLeaves=LeaveManagement::where('status', 'LIKE', "%{$request->input('status')}%");
                }
            }

            $allLeaves = $allLeaves ->orderBy('name', 'ASC')
                                    ->orderBy('type', 'ASC')
                                    ->orderBy('start', 'ASC')
                                    ->orderBy('start', 'ASC')
                                    ->orderBy('status', 'ASC')
                                    ->paginate(25);

            return view('pages.newleaverequest')->with(['allLeaves'=>$allLeaves]);  
        }
        else 
        {
            $allLeaves=LeaveManagement::orderBy('name', 'ASC')->paginate(25);  
        }

        $allLeaves->appends(array('name'=>Input::get('name')));

        return view('pages.newleaverequest', compact('allLeaves'));

    }

  

Вот мой файл просмотра

 <form action="{{ route('manage_leave') }}" method="GET" role="search">
<div class="row">
  <div class="form-group">

  <input type="text" class="form-control " id="search1" name="name" placeholder="Employee Name">                                    
  <select class="custom-select form-control col-md-2" id="search5" name="leaveType">
     <option value="">Leave Type</option>
     <option value="casual">Casual Leave</option>
     <option value="medical">Medical Leave</option>
     <option value="early">Early Leave</option>
</select>

   <input type="date" class="form-control " id="search3" name="leaveDate" placeholder="Leave Date">
   <input type="date" class="form-control " id="search4" name="appliedDate" placeholder="Applied Date">
   <select class="custom-select form-control col-md-2" id="search5" name="status">
   <option value="">Status</option>
   <option value="Pending">Pending</option>
   <option value="Approved">Approved</option>
   <option value="Rejected">Rejected</option>
</select>
amp;emsp;amp;emsp;
<button class="btn btn-info" type="submit"><i class="fa fa-search "></i></button>
</div>
</div>
</form>
  @if(isset($allLeaves))
                        <table class="table table-bordered table-striped">
                            <thead>
                                <tr>
                                    <th>Employee Name</th>
                                    <th>Leave Type</th>
                                    <th>Leave Duration</th>
                                    <th>Applied On</th>
                                    <th>Status</th>
                                    <th>Action</th>
                                </tr>
                            </thead>
                            <tbody>
                                @if($allLeaves != null)
                                @foreach($allLeaves as $leave)
                                <tr>
                                    <td> {{ $leave->name }} </td>
                                    <td> {{ $leave->type }} </td>
                                    <td>
                                        {{ date('d-m-Y', strtotime($leave->start)) }} To
                                        {{ date('d-m-Y', strtotime($leave->end)) }}
                                    </td>
                                    <td> {{ date('d-m-Y', strtotime($leave->start)) }} </td>
                                    <td>
                                        @if($leave['status']=='Pending')
                                        <span class="badge badge-pill badge-warning" style="color:white;font-size: 90%;font-weight:bold;">Pending</span>
                                        @elseif($leave['status']=='Approved')
                                        <span class="badge badge-pill badge-success" style="color:white;font-size: 90%;font-weight:bold;">Approved</span>
                                        @else
                                        <span class="badge badge-pill badge-danger" style="color:white;font-size: 90%;font-weight:bold;">Rejected</span>
                                        @endif
                                    </td>
                                    <td>
                                        <a href="{{route('handle_leave', $leave->id)}}" class="btn btn-info text-white">Details</a>
                                    </td>
                                </tr>
                                @endforeach
                                @endif
                            </tbody>
                        </table>
                        <div>
                            {{ $allLeaves->render() }}
                            @endif
                        </div>
                    </div>
                </div>
            </div>
  

Комментарии:

1. В какой переменной вы публикуете свою дату? Также из каких полей вы хотите выполнить поиск по этой конкретной дате между ними?

2. <тип ввода = «дата» класс =»форма-контроль» идентификатор = «search3» имя = «Дата оставления» заполнитель =»Дата оставления»> Вот моя строка поиска В дате оставления, которую я публикую

3. Я думаю, вы не поняли мой вопрос. Если я хочу проверить leaveDate , что вы указали, находится между диапазоном или нет, то за какими полями этого диапазона я должен следить? Короче говоря, какое поле базы данных мне использовать для сравнения, если ваша дата находится между?

4. Owk Я сожалею, что в базе данных имена полей являются StartDate и EndDate

Ответ №1:

Попробуйте заменить блок кода вашей функции:

 if (!empty($request->input('leaveDate'))) 
{
    if ($flg) 
    {
        $allLeaves = $allLeaves->orWhere(function($query) use ($request){
            $query->whereDate('end', '>=', $request->input('leaveDate'))
                ->whereDate('start', '<=', $request->input('leaveDate'));
        });
    } 
    else 
    {
        $allLeaves = LeaveManagement::where('end', '>=', $request->input('leaveDate'));
    }
}
  

Дайте мне знать, если это сработает?

Комментарии:

1. Это работает, но есть одна проблема ibb.co/mCdb7x3 Посмотрите, если я буду искать запись между 26-05-2019 и 27-05-2019 , это также даст мне запись 4-го месяца

2. Я обновил условие where моего ответа. Просто поместите ее и проверьте.

3. Нет, проблема все та же, у меня есть 2 записи С 26-05-2019 по 27-05-2019 и с 06-05-2019 по 18-05-2019 , если я выполняю поиск с 07-05-2019 , то он должен выдать мне только 2-ю запись, это даст мне обе

4. ОК. Я хочу посмотреть, что вы передали в свою $request переменную. Можете ли вы просто написать print_r($request->all()); exit; в верхней части вашего метода и опубликовать здесь результат?

5. Это отключает этот Array ( )