我一直在研究一个 laravel 高级搜索过滤器,用户可以在其中输入表单中的多个字段,并在提交时为给定字段生成数据表。 如果字段为空,则它只显示数据库中的所有记录(取消设置过滤器(。
public function advanced_search(Request $request)
{
//user submitted data in post
$post = $request->all();
/*
filter array keys are defined here
e.g first_name, last_name
*/
$simple_filter = array(
"first_name" => "",
"last_name" => "",
"email" => "",
"company_name" => "",
);
foreach ($simple_filter as $key => $value) {
if (isset($post[$key]) && ($post[$key] != null) && !empty($post[$key])) {
$simple_filter[$key] = $post[$key];
} else {
//user didn't send this field in post data so removing this from filter list
unset($simple_filter[$key]);
}
}
$query = DB::table('contacts')->where($simple_filter)->get();
return DataTables::of($query)
->toJson();
}
现在这段代码工作正常。但要求是改变的。此代码仅返回确切的详细信息。现在我想显示记录,即使子字符串匹配。(如 %数据$(。我该如何修改它?
如果要查找其中一个字段like
给定表单输入的联系人,请使用orWhere()
。或者,如果要使用所有表单输入元素来筛选联系人,请使用where()
:
public function advanced_search(Request $request)
{
$query = Contact::query();
$fields = ['first_name', 'last_name', 'email', 'company_name'];
foreach ($fields as $field) {
if ($request->filled($field)) {
$query = $query->orWhere($field, 'like', '%' . $request->get($field) . '%');
}
}
return DataTables::of($query->get())->toJson();
}
此外,您正在执行大量冗余检查。只需改用->filled()
方法即可。如果字段为空,或者不存在或null
,它将返回false
。
如果要确定请求中是否存在值并且不为空,则可以使用 fill 方法
https://laravel.com/docs/5.5/requests#retrieving-input
循环之前创建查询,并在循环中添加所有where
筛选器。where
函数的第二个参数可以是比较器,在您的情况下:like
。
$query = DB::table('contacts');
foreach ($simple_filter as $key => $value) {
if (isset($post[$key]) && ($post[$key] != null) && !empty($post[$key]))
{
$query = $query->orWhere($key, 'like', '%' . $value . '%');
}
}
return DataTables::of($query->get())->toJson();