Laravel 5 数据库 就像数组上的查询一样



我一直在研究一个 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();

最新更新