【问题标题】:Laravel multiple dropdown searchLaravel 多重下拉搜索
【发布时间】: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 语句吗?这似乎效率很低。

【问题讨论】:

    标签: eloquent laravel-8 laravel-query-builder


    【解决方案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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多