Laravel 多重下拉搜索

Posted

技术标签:

【中文标题】Laravel 多重下拉搜索【英文标题】:Laravel multiple dropdown search 【发布时间】:2021-09-25 10:27:39 【问题描述】:

我是 laravel 新手,有一个小问题。我有多个下拉菜单和 3 个输入文本框,用于缩小单个数据表中的搜索范围。数据表是作业历史。下拉菜单和输入如下:

类(下拉),

类型(下拉),

工作状态(下拉),

部门(下拉),

开始日期(输入从日期开始搜索工作),

结束日期(输入以搜索迄今为止的工作),

Last Called(上次调用日期的输入),

我的代码是

$jobs=Job::where('class','LIKE','%'.$request->class.'%')
                 ->orwhere('job_status','LIKE','%'.$request->status.'%')
                 ->orwhere('type','LIKE','%'.$request->type.'%')
                 ->orwhere('department','LIKE','%'.$request->department.'%')
                 ->orWhereBetween('date_booked',[$request->start_date, $request->end_date])
                 ->orWhereBetween('date_last_called',['1970-01-01',$request->last_called])->get();

这只会给我一个标准的结果(例如:仅按类别排序)。 如果我使用“where”而不是“orWhere”,我可以让它工作,但问题是使用所有下拉列表和输入是可选的。如果需要,他们应该只能说使用 2 或 3 个下拉菜单。我可以使用很多 if 语句,但这似乎效率低下。例如:

 if($request->class && $request->start_date && $request->end_date)
    
        $jobs = Job::where('class','LIKE','%'.$request->class.'%')
        ->whereBetween('date_booked',[$request->start_date, $request->end_date])->get();
    
    else if($request->class)
    
        $jobs = Job::where('class','LIKE','%'.$request->class.'%')->get();
    
    else if($request->status)
    
        $jobs = Job::where('job_status','LIKE','%'.$request->status.'%')->get();
    
    else if($request->type)
    
        $jobs = Job::where('type','LIKE','%'.$request->type.'%')->get();
    
    else if($request->department)
    
        $jobs = Job::where('department','LIKE','%'.$request->department.'%')->get();
    

...但是我不需要为每个排列创建一个 if 语句吗?这似乎效率很低。

【问题讨论】:

【参考方案1】:

也许你可以使用 OR 语句和 whereRaw

$jobs = Job::whereRaw('? IS NULL OR class=?', [$request->class, $request->class])->whereRaw('? IS NULL OR job_status = ?', [$request->job_status, $request->job_status]);

编辑:

在需要获取结果之前,不需要调用 get 方法

$jobs = Job::on();

if($request->class && $request->start_date && $request->end_date)
    
        $jobs = $jobs->where('class','LIKE','%'.$request->class.'%')
        ->whereBetween('date_booked',[$request->start_date, $request->end_date]);
    
    if($request->class)
    
        $jobs = $jobs->where('class','LIKE','%'.$request->class.'%');
    
    if($request->status)
    
        $jobs = $jobs->where( 'job_status', 'LIKE', '%'.$request->status.'%');
    
    if($request->type)
    
        $jobs = $jobs->where( 'type','LIKE','%'.$request->type.'%');
    
    if($request->department)
    
        $jobs = $jobs->where('department','LIKE','%'.$request->department.'%');
    


   return $jobs->get();

【讨论】:

感谢您的建议。我玩了一下它,但在“上课”后它就停止了。所以它不会进入'job_status'。虽然它确实按“类”排序。只是想弄清楚如何按所有条件或仅部分条件进行搜索。 我已经用 ifs 替换了 else if 语句,它应该可以解决问题 这似乎更接近解决方案,尽管并非如此。它仍然只搜索一个标准。我认为这是因为,如果说,我搜索“状态”和“类型”。它只会给我基于“类型”的搜索,因为 $jobs 变量被先前的 $jobs 变量覆盖,该变量基于“状态”标准进行搜索。仍然不知道如何获得两者。 这很奇怪,因为 $jobs 变量没有被覆盖,但是每个 where 条件都链接到前一个条件,请尝试检查请求值是什么。您可以使用 toSql 方法来查看查询是如何构建的。顺便说一句,您不应该连接值,请尝试在您的 where 条件上使用参数。【参考方案2】:

好的,所以问题是当我使用“start_date”、“end_date”和“last_call”时,它们会出现 NULL,因此除非我使用“where”进行搜索,否则搜索是空的。然后我会得到我想要的搜索,而不是在我想要的日期。如果这些值为 NULL,我会通过一些条件语句来解决这个问题。

        if($request->start_date ==NULL)
        
            $request->start_date = date("1970-01-01");
        
        if($request->end_date ==NULL)
        
            $request->end_date = date("Y-m-d");
        
        if($request->last_called ==NULL)
        
            $request->last_called = date("Y-m-d");
        

        $jobs = Job::where('class','LIKE','%'.$request->class.'%')
                    ->where('job_status','LIKE','%'.$request->status.'%')
                    ->where('type','LIKE','%'.$request->type.'%')
                    ->where('department','LIKE','%'.$request->department.'%')
                    ->whereBetween('date_booked',[$request->start_date, $request->end_date])
                    ->whereBetween('date_last_called',['1970-01-01',$request->last_called])->get();

    return $jobs;

这修复了它,现在它可以正常工作了。谢谢。

【讨论】:

以上是关于Laravel 多重下拉搜索的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 工厂的多重关系

Laravel 多重计数多重连接

Laravel 自定义多重身份验证

多重连接 laravel 雄辩

Laravel 多重关系

如何在 laravel 5.2 中使用多重身份验证 [关闭]