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 多重下拉搜索的主要内容,如果未能解决你的问题,请参考以下文章