我一直在使用laravel advance搜索过滤器,用户可以在表单中输入多个字段,并在提交时生成给定字段的数据表。如果字段为空,则只显示数据库中的所有记录(取消设置过滤器)。
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%data $)。我怎么修改这个?
答案 0 :(得分:2)
您可以在循环之前创建查询,并在循环中添加所有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();
答案 1 :(得分:2)
如果要查找其中一个字段为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()
方法即可。如果字段为空,或者不存在或false
,则会返回null
。
如果您想确定请求中是否存在值且不为空,则可以使用填充方法