как сделать запрос с несколькими фильтрами в laravel? - PullRequest
1 голос
/ 17 апреля 2020

У меня есть 3 фильтра запросов, которые будут использоваться для поиска. Первый запрос - это выбранный вариант запроса, второй - запрос даты, когда я хочу выполнить поиск между датой начала и конца даты. последний запрос о поиске имени, et c. Единственный рабочий запрос, только последний. Что происходит с моим кодом, я думал, что с моим кодом проблем нет

Вот мой код, который использует фильтр

filtercontroller. php

public function viewType(Request $request, ReportViewAll $reportview){

    $reportview = $reportview->newQuery();
    if ($request->has('program')) {
        if($request->input('program') == 'reportall'){
            $reportview;
        }
        elseif($request->input('program') == 'reportactive'){
            $reportview->where('crewprogram_isdisabled', '=',0);
        }
        elseif($request->input('program') == 'reporthistory'){
            $reportview->where('crewprogram_isdisabled', '=',1);
        }
    }

    if(($request->has('datestart') && $request->has('dateend'))){
        $reportview->whereBetween('crewprogrammemo_placement_date', 
        array($request->input('datestart'), $request->input('dateend')));
    }

    if($request->has('search')){
        $reportview->where ( 'employee_nik', 'LIKE', "%{$request->search}%" )
                ->orWhere ( 'employee_nama', 'LIKE', "%{$request->search}%" )
                ->orWhere ( 'show_focus_id', 'LIKE', "%{$request->search}%" )
                ->orWhere ( 'show_name', 'LIKE', "%{$request->search}%" );
    }

    return $reportview->get();

    // return view('CrewProgram.ReportView.index', compact('reportview'));
}

Что я должен сделать, чтобы три из них начали работать, а не только один работающий запрос

Отредактировано

public function viewType(Request $request, ReportViewAll $reportviewall){

    $reportviewall = $reportviewall->newQuery();

    if ($request->has('program')) {
        if($request->input('program') == 'reportall'){
            $reportviewall;
        }
        elseif($request->input('program') == 'reportactive'){
            $reportviewall->where('crewprogram_isdisabled', '=',0);
        }
        elseif($request->input('program') == 'reporthistory'){
            $reportviewall->where('crewprogram_isdisabled', '=',1);
        }
    }

    if(($request->has('datestart') && $request->has('dateend'))){
            $reportviewall->whereBetween('crewprogrammemo_placement_date', 
            array($request->input('datestart'), $request->input('dateend')));
    }

   If($request->has('search')){
        $reportviewall->where(function($query) use($request) {
            $query->where('employee_nik', 'LIKE', "%{$request->search}%" )
                ->orWhere ( 'employee_nama', 'LIKE', "%{$request->search}%" )
                ->orWhere ( 'show_focus_id', 'LIKE', "%{$request->search}%" )
                ->orWhere ( 'show_name', 'LIKE', "%{$request->search}%" );
        });
    }


    $reportviewall = $reportviewall->get();
            return view('CrewProgram.ReportView.index', compact('reportviewall'));
}

1 Ответ

2 голосов
/ 17 апреля 2020

Проблема с вашими запросами состоит в том, что когда вы передаете поисковый фильтр, вы соединяете несколько orWhere() с запросом, что означает, что любой запрос к одному из этих фильтров, который имеет значение true, будет возвращен, он выиграет ' Не имеет значения, если какой-либо из других фильтров был ложным, решение этого состоит в том, чтобы обернуть поисковый фильтр в функцию обратного вызова, как это:

if($request->has('search')){
    $reportview->where(function($query) use($request) {
        $query->where('employee_nik', 'LIKE', "%{$request->search}%" )
            ->orWhere ( 'employee_nama', 'LIKE', "%{$request->search}%" )
            ->orWhere ( 'show_focus_id', 'LIKE', "%{$request->search}%" )
            ->orWhere ( 'show_name', 'LIKE', "%{$request->search}%" );
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...