首页 > 解决方案 > 如何在 laravel 中进行多重过滤查询?

问题描述

我有 3 个查询过滤器将用于搜索。第一个查询是选择选项查询,当我想在日期开始和日期结束查询之间进行搜索时,第二个查询是日期查询。最后一个查询是关于搜索名称等。唯一有效的查询只是最后一个。我的代码会发生什么,我认为我的代码没有任何问题

这是我使用过滤器的代码

过滤控制器.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'));
}

我应该怎么做才能让他们三个开始工作,而不仅仅是 1 个正在工作的查询

已编辑

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'));
}

标签: laraveleloquent

解决方案


您的查询的问题是,当您传递搜索过滤器时,您将多个orWhere()' 链接到查询,这意味着将返回对这些过滤器之一的任何查询,如果任何其他过滤器为假,解决方案是将搜索过滤器包装在回调函数中,如下所示:

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}%" );
    });
}

推荐阅读