Laravel 5数据库类似于对数组的查询

时间:2018-01-08 09:31:44

标签: php laravel

我一直在使用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 $)。我怎么修改这个?

2 个答案:

答案 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

  

如果您想确定请求中是否存在值且不为空,则可以使用填充方法

https://laravel.com/docs/5.5/requests#retrieving-input